perm filename GOLOOK.FAI[GO,ALS] blob
sn#105687 filedate 1974-06-12 generic text, type T, neo UTF8
00100 TITLE GOLOOK 7/24/70
00200 ; LAST MODIFIED BY GJA 7/2/72
00300
00400 EXTERN GBOARD,GB1,KOTAC,STRPTR,GB1TST,GODOWN,EYENUM
00500 EXTERN NDXFOR,GRPPTR,PNTDPY,GRUPNO,ELTNOS,GBDTST,G1IKKN
00600 EXTERN PFORCE,IFORCE,KFOR,BRDDPY,MSGDPY,TTYGUY,HEURBT
00700 EXTERN DRIVER,DRIVR1,TACSAV,ADLEND,EYDIAG,G1DIAG
00800 EXTERN EYCHEK,TACSV1
00900 INTERN FORCES,SAVES,NGHBR1,NGHBOR,STRSET,BKFLAG,EXMOVE
01000 INTERN STRRST
01100
01200
01300 OPDEF ERRUUO [5B8]
01400 DEFINE SAILERR & (NMBR,MESSAGE) <
01500 ERRUUO 1,[ASCIZ /GOLOOK ERROR NUMBER &NMBR& &MESSAGE/]>
01600
01700
01800
01900 ;*****SYMBOLIC REGISTERS USED OR AVAILABLE
02000 ↓ZER←0
02100 ↓TAC←1
02200 ↓TAC1←2
02300 ↓TAC2←3
02400 ↓TAC3←4
02500 ↓TAC4←5
02600 ↓TAC5←6
02700 ↓FRIEND←7
02800 ↓ENEMY←10
02900 ↓STKREG←10
03000 ↓BLANK←11
03100 ↓BWREG←12
03200 ↓SEARCH←13
03300 ↓REPLCE←14
03400 ↓CLEAR←15
03500 ↓PDP←17
03600
03700 ;*****CONSTANT SYMBOLS OF LARGE IMPORT
03800 MXARNO←=50 ;MAX NUMBER OF ARMIES (OR WALLS)
03900 BRDWTH←=21 ;BOARD WIDTH, INCLUDING EDGES
04000 STRMAX←=127 ;MAX NUMBER OF STRINGS
04100 WHTOCC←400000 ;WHITE POINT OCCUPANCY
04200 WHTSHF←-=17 ;SHIFTS WHTOCC TO RIGHT END OF WORD
04300 BLKOCC←200000 ;BLACK POINT OCCUPANCY
04400 BNKOCC←100000 ;BLANK POINT OCCUPANCY
04500 NONOCC←40000 ;OFF-EDGE POINT
04600 STRCNT←1 ;STRING COUNTER
04700 STRBTS←177 ;MAXIMUM ALLOWABLE # OF STRINGS
04800 GRPCNT←200 ;GROUP COUNTER
04900 GRPBTS←177 ;MAXIMUM ALLOWABLE # OF GROUPS
05000 WHTNGH←1 ;WHITE NEIGHBOR COUNTER
05100 BLKNGH←20 ;BLACK NEIGHBOR COUNTER
05200 NGHBTS←17 ;MAXIMUM ALLOWABLE # OF NEIGHBORS
05300 OCCBIT←10 ;POINT OCCUPIED NEIGHBOR BIT
05400 AWSRRH←1 ;STRING LIBERTY COUNTER
05500 AWSRRM←777 ;MAXIMUM ALLOWABLE # OF STR LIBS
05600 AWSLRH←1000 ;STRING STONE COUNTER
05700 AWSLRM←777 ;MAX ALLOWABLE # OF STONES
05800 BCON←100000 ;CONNECTED TO BLACK
05900 WCON←200000 ;CONNECTED TO WHITE
06000 HBCON←40000 ;HALF-CONNECTED TO BLACK
06100 HWCON←20000 ;HALF-CONNECTED TO WHITE
06200 LBSCUT←4 ;MAX # TARGET STRING LIBS WE WILL CHASE
06300 LCMPLX←3 ;MAX # TARGET COMPLEX LIBS ≤ LCMPLX+CUTLBS
06400 MXSTRG←=12 ;MAX NUMBER OF STRINGS CONSIDERED
06500 MXMVES←=15 ;MAX NUMBER OF MOVES GENERATED
06600 PHASE1←4 ;MAX NUMBER OF PHASE ONE ACCEPTABLES
06700 PHASE2←2 ;MAX NUMBER OF PHASE TWO ACCEPTABLES
06800 PH1CUT←=100 ;PHASE ONE CUTOFF DEPTH
06900 MAXMOV←=30 ;MAX NUMBER OF MOVES ON MOVE LIST
07000 MAXSTR←=30 ;MAX NUMBER OF STRINGS ON STRINGS LIST
07100 TACBIT←400000 ;GBOARD TACTICAL SCOPE MARKER
07200
07300
07400
07500
07600 ;**********
07700 ; THE FOLLOWING LOCATIONS ARE USED AS TEMPORARY STORAGE DURING
07800 ;THE LOOKAHEAD EVALUATIONS. SOME ARE MUCH MORE PERMANENT THAN OTHERS.
07900 ;**********
08000 NOKVEC: BLOCK 12 ;THIS BLOCK HOLDS THE QUANTITIES GOT FROM
08100 ;THE CALL TO LIBEST AT THE PROPOSED MOVE POINT.
08200 ;THE FIRST 11 LOCATIONS CORRESPOND IN MEANING
08300 ;TO THOSE IN LIBVEC (SEE PAGE 9). NOKVEC+11
08400 ;HOLDS # "NEW" LIBS WRT TARGET COMPLEX.
08500 R16SAV: 0 ;HOLDS REGISTER 16 FOR SAIL
08600 FORSAV: 0 ;-1 MEANS SAVER IS MOVING, 0 MEANS FORCER
08700 BNDCNL: 0 ;KEEPS TRACK OF THE NUMBER OF "ACTIVE" MOVES
08800 BNDCNS: 0 ;KEEPS TRACK OF THE NUMBER OF "ACTIVE" STRINGS
08900 T2SAVE: 0 ;HOLDS VALUE OF REG TAC2 IN RIGHT HALF
09000 NFRND: 0 ;COUNTS #FRIENDLY NEIGHBORS ∨ HOLDS "FRIENDLY" MARK
09100 NBLANK: 0 ;COUNTS # BLANK NEIGHBORS
09200 KOSAVE: 0 ;SET IF KOTAC MEANS KO FOR MOVER
09300 KOSAV1: 0 ;SET IF KOTAC MEANS KO FOR NON-MOVER
09400 TCMPLX: 0 ;# BLANKS IN TARGET COMPLEX
09500 TEMP1: 0
09600 TEMP2: 0
09700 TEMP3: 0
09800 STRGNM: 0 ;HOLDS STRING NAMES DURING LIBERTY ADD-ONS
09900 LIBSNO: 0 ;# LIBS, USED BY NEIGHS
10000 TGLIBS: 0 ;# TARGET LIBERTIES
10100 XTDFRC: 0 ;ADDRESS OF SAVER WINNER BY EXTENSION
10200 XTDFR1: 0 ;SECOND EXTENSION WINNER ADDRESS
10300 TWOATR: 0 ;COUNTS # FORCER SELF-ATES CREATED BY SAVER MOVE
10400 PDPSAV: 0 ;HOLDS REGISTER 17 (PDP) FOR EXTERNAL WORLD
10500 NOLIBS: 0 ;# LIBS, USED BY NEIGHS
10600 SAVWIN: 0 ;COUNTS # SAVER WINNER MOVES
10700 SAVWN1: 0 ;COUNTS # SAVER WINNER MOVES
10800 NOTWIN: 0 ;DISABLE CERTAIN WINNERS WHEN NDXFOR=5
10900 ;OR WHEN TARGET MAY BE LADDERED
11000 MUSTSV: 0 ;NAME OF STRING WHOSE DIRECT LOSS SAVES TARGET
11100 MSTSAV: 0 ;NAME OF STRING WHOSE LADDER LOSS SAVES TARGET
11200 EYECNT: 0 ;COUNTS # EYES IN TARGET COMPLEX
11300 SVCRIT: 0 ;-1 MEANS SAVER HAS 1-LIB TARGET STRING
11400 LOWBND: 0 ;CUTOFF ON # MOVES ALLOWED AFTER PRUNING
11500 STRRST: 0 ;IF ≠0 THEN MARK TACTICAL SCOPE IN GBOARD
11600 EXMOVE: 0 ;ADDRESS OF "FORCED" EXCHANGE (FOUND BY NGHBOR)
11700 BKFLAG: 0 ;≠0 MEANS SAVER MUST BREAK THROUGH FORCER WALL
11800 CONFLG: 0
11900 STRONG: 0 ;# WEAK CHASER STRINGS WHICH REALLY ARENT
12000 NOCONS: 0 ;# CONNECTION POINTS FOR STRING (FOUND BY NEIGHS)
12100 MORLBS: 0 ;LIBS FROM BEING CONNECTED TO "NEW" STRING
12200 MORLBF: 0 ;FORCER EXTRA LIBS FROM CONNECTION
12300 AUGFLG: 0 ;USED TO REGULATE MOVE AUGMENTING LOOP (AT AUGFS1)
12400 AUGSRT: 0 ;HOLDS ADDRESS OF THE FIRST AUGMENTING MOVE
12500 WEAKNT: BLOCK =10 ;HOLDS NAMES OF WEAK NON-TARGETS WHICH ARENT
12600 FSLIBS: BLOCK 6 ;HOLDS NAMES OF STRONGLY AFFECTED NEIGHBOR STRINGS
12700 ;0 -- SAVER STRINGS CAPTURED
12800 ;1 -- SAVER STRINGS ATARIED
12900 ;2 -- SAVER STRINGS 2-LIBBED
13000 ;3 -- FORCER STRINGS CAPTURED
13100 ;4 -- FORCER STRINGS ATARIED
13200 ;5 -- FORCER STRINGS 2-LIBBED
13300 BLKSAV: BLOCK MAXSTR+1
13400 AFFSTR: BLOCK MAXSTR+1 ;HOLDS LIST OF AFFECTED STRINGS
13500 AFFMOV: BLOCK MAXMOV+1 ;HOLDS LIST OF PROPOSED MOVES
13600 LBSSTR: BLOCK MAXMOV+1 ;HOLDS # LIBERTIES FOR EACH SIDE
13700 AUXBTS: BLOCK MAXMOV+1 ;SPECIAL PROPERTIES TURN ON BITS HERE
13800 0
13900 CONPNT: BLOCK 6 ;USED BY NEIGHS TO FIND CONNECTIONS
14000 REGSTR: BLOCK 16 ;TEMPORARY STORAGE ARRAY
14100
14200
14300
14400
14500 ;**********
14600 ; THE FOLLOWING QUANTITIES ARE STATUS BITS COMPUTED FOR EACH PROPOSED
14700 ;BLANK TURNED UP IN THE PLAUSIBLE MOVE SEARCH FOR CAPTURING A PARTICULAR
14800 ;STRING OF STONES. THE BITS ARE SET IN THE LEFT HALF OF THE WORD
14900 ;CONTAINING THE BOARD POSITION OF THE POINT, AND THEN A SIMPLE BUBBLE
15000 ;SORT IS USED TO DETERMINE MOVE PRIORITY.
15100 ;**********
15200 NATARI←200000 ;NOT ATARI POINT FOR SIDE MOVING
15300 EYMAKE←100000 ;MAKES AN EYE FOR SAVER
15400 NWLIB2←40000 ;2 NEW LIBS ADDED TO TARGET COMPLEX
15500 NEWLIB←20000 ;1 NEW LIB ADDED TO TARGET COMPLEX
15600 NXTTGT←10000 ;NEXT TO TARGET STRING
15700 WKNTGT←4000 ;WEAK NON-TARGET EXTEND
15800 CONTGT←2000 ;NEXT FRIENDLY STRING NEXT TARGET
15900 NREDUC←1000 ;SAVER MOVE DOES NOT REDUCE TARGET LIBS
16000 CAPENM←400 ;NEXT TO ONE-LIB STRING (NON-MOVING)
16100 CAPFRD←200 ;NEXT TO ONE-LIB STRING (MOVING)
16200 TWOATE←100 ;CREATES 2 NEIGHBORING FORCER SELF-ATARIES
16300 THRTGS←40 ;THIS MOVE ATARIES AN OPPOSING STONE
16400 SAVTGS←20 ;ATARI POINT FOR OPPONENT
16500 TWOLIB←10 ;TWO-LIBERTY STRING IS INVOLVED IN MOVE
16600 NON1ST←4 ;NOT ON FIRST LINE
16700 WKSIDE←2 ;ON FORCER WEAK SIDE
16800 NON2ND←1 ;ABOVE SECOND LINE
16900
17000
17100
17200
17300
17400 ;**********
17500 ; THE RETURNS FROM FORCES AND SAVES ARE IMPORTANT TO THE EVALUATION
17600 ;PROGRAM ONLY WITH RESPECT TO SIGN. A POSITIVE RETURN MEANS THE STRING IN
17700 ;QUESTION WAS CAPTURED, WHILE A NEGATIVE RETURN MEANS THE STRING GOT AWAY.
17800 ;THE ABSOLUTE VALUE OF THE RETURN IS A SIGNAL OF THE REASON WHY THE LINE
17900 ;OF PLAY WAS TERMINATED. THE FOLLOWING VALUES ARE CURRENTLY USED:
18000 ;
18100 ; 1 ... GENERAL PURPOSE, NO SPECIFIC MEANING
18200 ; 2 ... LADDER ANALYSIS GAVE THE ANSWER DIRECTLY
18300 ; 3 ... KO WAS IMPORTANT IN LIFE OR DEATH
18400 ; 4 ... CAPTURE OF STONES DECIDED THE ISSUE
18500 ; 5 ... TOO MANY STRINGS TO CONTINUE THE ANALYSIS
18600 ; 6 ... TOO MANY PROPOSED MOVES TO CONTINUE THE ANALYSIS
18700 ; 7 ... SAVER HAS A WAY TO REFUTE THE LAST FORCER MOVE
18800 ; 8 ... FORCED MOVE WAS ILLEGAL OR SELF-ATARI
18900 ; 9 ... SAVER CAN WIN BY DIRECT EXTENSION
19000 ; 10 .. SAVER CAN WIN BY A NON-EXTENSION MOVE
19100 ; 11 .. GOT TO PRUNER WITH NO LEGAL MOVES
19200 ; 12 .. FORCER HAS LADDER LOSS + ANOTHER PROBLEM
19300 ; 13 .. SAVER CAN WIN BECAUSE HE HAS TWO EYES
19400 ; 14 .. FORCER REFUTES ITS OWN PREVIOUS MOVE
19500 ; 15 .. SAVER WINS BECAUSE TARGET COMPLEX TOO BIG
19600 ; 999 . ANALYSIS IS TOO LONG (SET IN GOEVAL)
19700 ;
19800 ;**********
19900
20000
20100
20200
20300
20400 ;**********
20500 ; THE AUXILIARY BITS ARE USED TO RECORD EXCEPTIONAL CONDITIONS HOLDING
20600 ;FOR PARTICULAR MOVES. IF THE CONDITION IS TRUE, IT IS IMPORTANT ENOUGH TO
20700 ;ALTER THE SCORING GOT BY THE 17 LEFTHALF BITS.
20800 ;**********
20900 ;RIGHT HALF BITS.....
21000 STHRET←1 ;SAVER THREAT POINT
21100 SDBLAT←2 ;SAVER DOUBLE ATE POINT
21200 SEMPT←4 ;SAVER EMPTY TRIANGLE POINT
21300 SATTWO←10 ;SAVER ATARI AND TWOLIB POINT
21400 SREVIV←20 ;SAVER CAN PROFITABLY REVIVE STONES
21500 LADBRK←40 ;BREAKS LADDER ON TARGET
21600 MAYLAE←100 ;THE LADDER MAY WORK FOR NONMOVER
21700 NLADDE←200 ;THE LADDER DOESNT WORK FOR NONMOVER
21800 NSTHRT←400 ;NOT SAVER THREAT POINT
21900 NLADDR←1000 ;THE LADDER DOESNT WORK FOR MOVER
22000 MAYLAD←2000 ;THE LADDER MAY WORK FOR MOVER
22100 LADLOS←4000 ;LADDER LOSS POINT (THREAT)
22200 NEWSTG←10000 ;CONNECTED TO NON-TARGET-COMPLEX FRIENDLY
22300 FDBLAT←20000 ;FORCER DOUBLE ATE POINT
22400 HLPSTR←40000 ;HELPS FORCER PLAY ON SELF-ATE POINT
22500 FTHRET←100000 ;TARGET MAY BE LADDERABLE
22600 ;LEFT HALF BITS.....
22700 LADLSM←1 ;LADDER LOSS IF MOVER MOVES HERE
22800 HEURCF←2 ;CAPFRD AWARD BY LADCHK
22900 FORHLP←4 ;SAVER ATARI OF FORCER STONE
23000 LADLSN←10 ;LADDER LOSS IF NON-MOVER MOVES HERE
23100 SSATE←20 ;SAVER SELF-ATARI POINT
23200 FSATE←40 ;FORCER SELF-ATARI POINT
23300 SILLPT←100 ;SAVER ILLEGAL MOVE POINT
23400 FILLPT←200 ;FORCER ILLEGAL MOVE POINT
23500 STWOLB←400 ;SAVER STONES TWOLIBBED HERE
23600 FTWOLB←1000 ;FORCER STONES TWOLIBBED HERE
23700 KOTAKS←2000 ;SAVER TAKES KO AT THIS POINT
23800 KOTAKF←4000 ;FORCER TAKES KO AT THIS POINT
23900 NEWCGT←10000 ;SAVEX CODE MADE THIS POINT CONTGT
24000 SURCAP←20000 ;CERTAIN CAPTURE OF TWO-LIB STONES
24100 SNACAP←40000 ;CAPTURE BY SNAPBACK BY SIDE MOVING
24200 SNACPN←100000 ;CAPTURE BY SNAPBACK BY SIDE NOT MOVING
24300
24400
24500
24600
24700
24800 ;**********
24900 ; REGULATE CUTOFFS PARTIALLY IN TERMS OF CURRENT DEPTH OF SEARCH
25000 ;IN ORDER TO HELP COTROL WANDERING ANALYSES. THE LEFT HALF OF CUTOFF
25100 ;CONTAINS MAX # LIBS ALLOWED IN TARGET, WHILE THE RIGHT HALF CONTAINS
25200 ;THE MAX DEPTH FOR WHICH THIS NUMBER IS ALLOWED.
25300 ;**********
25400 CUTOFF: XWD LBSCUT+2,0
25500 XWD LBSCUT+1,=20
25600 XWD LBSCUT,=50
25700 XWD LBSCUT-1,=75
25800 XWD LBSCUT-2,=120 ;STRING "GETS AWAY" AT PLY =24
25900 XWD LBSCUT-3,=1000
26000
26100 CUTLBS: 0 ;CURRENT VALUE OF LIBS CUTOFF
26200 CUTLB1: 0 ;CUTLBS+1
26300 CUTLB2: 0 ;CUTLBS+2
26400 CUTLBX: 0 ;CURRENT VALUE OF TCMPLX CUTOFF
26500
26600 ;**********
26700 ; SAVES IS THE HEADER FOR PLAYFS WHEN WE WISH TO RANK MOVES
26800 ;ACCORDING TO THEIR UTILITY IN SAVING A SPECIFIED STRING OF STONES. THIS
26900 ;ROUTINE IS CALLED ONLY DURING LOCAL LOOKAHEAD.
27000 ;**********
27100 SAVES: SETOM FORSAV
27200
27300 ;*****INITIALIZE FOR FORCES, SAVES
27400 SETOM KFOR ;INITIALIZE REUTUN VALUE TO "ESCAPES"
27500 MOVEI TAC,1
27600 HRRZ TAC3,CUTOFF(TAC)
27700 CAMG TAC3,NDXFOR
27800 AOJA TAC,.-2
27900 HLRZ TAC3,CUTOFF(TAC) ;# LIBERTIES CUTOFF
28000 MOVEM TAC3,CUTLBS
28100 MOVEI TAC,1(TAC3)
28200 MOVEM TAC,CUTLB1
28300 MOVEI TAC,2(TAC3)
28400 MOVEM TAC,CUTLB2
28500 MOVEI TAC,LCMPLX(TAC3)
28600 MOVEM TAC,CUTLBX
28700 MOVEI TAC,3
28800 SETZM IFORCE(TAC)
28900 SETZM HEURBT(TAC)
29000 SOJGE TAC,.-2
29100 SETZM SVCRIT
29200 MOVE TAC,-1(PDP) ;STRING BASE POINT
29300 MOVEM 16,R16SAV ;SAVE REG 16
29400 MOVEM PDP,PDPSAV
29500 MOVE PDP,BRDDPY
29600 SETZM =20(PDP)
29700 ADD PDP,[IOWD =79,=21]
29800 JUMPE TAC,NOFORC
29900 LDB SEARCH,[POINT 7,GB1(TAC),35] ;STRING NAME
30000 LDB TAC2,[POINT 9,STRPTR(SEARCH),35] ;# LIBERTIES
30100 JUMPE SEARCH,NOFORC ;NO STRING
30200 CAMG TAC2,CUTLBS ;MAX # TARGET LIBS CUTOFF
30300 CAIL SEARCH,177 ;NO STRING
30400 JRST NOFORC
30500 MOVEM TAC2,TGLIBS ;SAVE # TARGET LIBS FOR PLAYFS
30600 MOVE BWREG,TAC ;SET CONVENTIONAL VALUE FOR BWREG
30700 SKIPN FORSAV
30800 JRST FORCES+2
30900
31000 ;*****CONTINUE WITH SAVES
31100 MOVEM TAC2,LIBSNO ;SET MAX # OF NEIGHBOR LIBERTIES
31200 CAIG TAC2,1
31300 SETOM SVCRIT ;ONLY ONE LIB IN TARGET STRING
31400 JRST NFORC1
31500
31600 ;**********
31700 ; FORCES RETURNS UP TO FOUR MOVES TO CONSIDER AS FORCING MOVES AGAINST
31800 ;THE SPECIFIED STRING DURING LADDER FORMATION. MOVES ARE RANKED IN ORDER OF
31900 ;ESTIMATED USEFULNESS IN CAPTURING A TARGET STRING DURING LOCAL LOOKAHEAD.
32000 ;**********
32100 FORCES: SETZM FORSAV
32200 JRST SAVES+1
32300 CAIE TAC2,1
32400 SOJ TAC2, ;NEVER LET LIBSNO BE ZERO
32500 MOVEM TAC2,LIBSNO ;MAX # OF NEIGHBOR LIBERTIES
32600 NFORC1: PUSHJ PDP,PLAYFS ;AFFMOV CONTAINS ALL RELEVANT PLAYS
32700 SKIPN FORSAV
32800 JRST NOFORC
32900 MOVEI PDP,1
33000 MOVEM PDP,KFOR ;NOT INSTANT SAVER
33100 NOFORC: MOVE PDP,PDPSAV
33200 MOVE 16,R16SAV
33300 SUB PDP,[XWD 2,2]
33400 JRST @2(PDP)
00100 BEGIN NGHBLK
00200
00300 ;**********
00400 ; MARK THE STRINGS CONNECTED TO THE TARGET (INCLUDING THE TARGET)
00500 ;IF REPLCE IS SET TO 4000000. DELETE ANY STRINGS FROM THE LIST IF THEY
00600 ;HAVE MORE THAN LBSCUT+2 LIBERTIES. SAVE IN REGISTER "CLEAR" ANY STRING
00700 ;(ENEMY) WHICH SHOWS UP AS ATARIED.
00800 ;**********
00900 0 ;HOLDS NAME OF CURRENT MOVE STRING
01000 MRKNGH: MOVEI TAC3,AFFSTR+1
01100 SETZ CLEAR, ;HOLDS ATARIED ENEMY STRING NAME
01200 MRKNG1: SKIPN SEARCH,0(TAC3)
01300 POPJ PDP,
01400 ANDI SEARCH,177
01500 LDB TAC1,[POINT 9,STRPTR(SEARCH),17]
01600 LDB TAC4,[POINT 9,STRPTR(SEARCH),35]
01700 TDNN FRIEND,GB1(TAC1)
01800 JRST MRKNG3
01900 ORM REPLCE,0(TAC3) ;CONNECTED TO CURRENT STRING
02000 CAME SEARCH,MRKNGH-1
02100 JRST MRKNG2 ;NOT CURRENT STRING
02200 MOVE TAC,TAC1 ;SAVE CURRENT MOVE POINT
02300 MOVE TAC1,STRPTR(SEARCH)
02400 TLNE TAC1,3000
02500 AOJA TAC3,MRKNG1 ;CURENT STRNG WAS ENDANGERED ∨ DEAD
02600 MRKNG2: CAIG TAC4,LBSCUT+2
02700 AOJA TAC3,MRKNG1 ;SMALL-ENOUGH FRIENDLY STRING
02800 MOVE TAC1,TAC3
02900 MOVE TAC2,1(TAC1) ;THIS FRIENDLY STRING IS TOO LARGE,
03000 MOVEM TAC2,0(TAC1) ;SO FORGET ABOUT IT
03100 JUMPE TAC2,MRKNG2+1
03200 AOJA TAC1,.-3
03300 MRKNG3: CAIE TAC4,1
03400 JRST MRKNG2
03500 SKIPN CLEAR
03600 SKIPA CLEAR,SEARCH ;SAVE ENEMY ATARIED STRING NAME
03700 SETO CLEAR, ;>1 ATARIED ENEMY STRING
03800 AOJA TAC3,MRKNG1
03900
04000 ;**********
04100 ; COLLECT STRING NAMES FOR TACTICAL ANALYSIS IN GOEVAL
04200 ;**********
04300 CLLSTR: MOVEI TAC3,AFFSTR+1
04400 MOVE TAC1,BRDDPY ;HOLDS FRIENDLY STRING NAMES
04500 MOVE TAC2,MSGDPY ;HOLDS ENEMY STRING NAMES
04600 CLLST1: SKIPN SEARCH,0(TAC3)
04700 JRST CLLST3+1
04800 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
04900 TDNN FRIEND,GB1(TAC)
05000 JRST CLLST2
05100 MOVEM SEARCH,0(TAC1) ;ANOTHER FRIENDLY
05200 AOJA TAC1,CLLST3
05300 CLLST2: MOVEM SEARCH,0(TAC2) ;ANOTHER ENEMY
05400 AOJ TAC2,
05500 CLLST3: AOJA TAC3,CLLST1
05600 SETZM 0(TAC1)
05700 SETZM 0(TAC2)
05800 POPJ PDP,
05900
06000 ;**********
06100 ; GET ALL AFFECTED STRINGS OF ATTACKING (PLAYER WHO IS MOVING) STONES
06200 ;INTO BRDDPY AND ALL AFFECTED ATTACKED STRINGS INTO MSGDPY. AN AFFECTED
06300 ;STRING HAS ≤4 LIBERTIES AND IS CONNECTED TO THE CURRENT STRING BY ZERO OR
06400 ;MORE AFFECTED STRINGS. NOTE THIS IS A FUNCTION PROCEDURE RETURNING ZERO
06500 ;IF IT FINDS TOO MANY STRINGS.
06600 ;**********
06700 0 ;HOLDS FRIENDLY SIDE BIT
06800 ↑NGHBOR:MOVE REPLCE,STRPTR
06900 MOVEM REPLCE,AFFSTR
07000 SETZM EXMOVE ;HOLDS ENEMY OBVIOUS MOVE LOCATION
07100 SETZM @BRDDPY ;ZERO FRIENDLY STRING STORAGE
07200 SETZM @MSGDPY ;ZERO ENEMY STRING STORAGE
07300 SKIPE SEARCH,-1(PDP)
07400 CAIL SEARCH,177
07500 JRST NOFORC+2
07600 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
07700 JUMPE TAC,NOFORC+2
07800 MOVEI FRIEND,BLKOCC+WHTOCC
07900 AND FRIEND,GB1(TAC)
08000 MOVEM FRIEND,NGHBOR-1 ;SAVE FRIENDLY SIDE
08100 MOVEM SEARCH,AFFSTR+1
08200 MOVEM SEARCH,MRKNGH-1 ;SAVE CURRENT STRING NAME
08300 SETZM AFFSTR+2 ;INITIALIZE TEMP STRING STORAGE
08400 MOVEI TAC1,LBSCUT+2
08500 MOVEM TAC1,LIBSNO ;LOOK FOR ≤LBSCUT+2 LIBERTIES
08600 MOVEI TAC1,MAXSTR
08700 MOVEM TAC1,BNDCNS ;LOOK FOR UP TO MAXSTR STRINGS
08800 PUSHJ PDP,NEIGHS
08900 SKIPG BNDCNS
09000 JRST NGHBO4+1 ;TOO MANY STRINGS EXIT
09100 HRLZI REPLCE,4 ;"CONNECTED-TO-FRIENDLY" MARK
09200 PUSHJ PDP,MRKNGH
09300 ;*****SPECIAL LOOP TO GET ENDANGERED OR DEAD FRIENDLY AND ALIVE OR
09400 ;*****ENDANGERED ENEMY STRINGS AT IKKEN TOBI POINTS
09500 MOVEI TAC2,3
09600 NGHBO1: MOVE TAC1,@GB1TST(TAC2)
09700 TRNN TAC1,BNKOCC
09800 JRST NGHBO3 ;NEIGHBOR POINT NOT BLANK
09900 MOVE TAC3,@G1IKKN(TAC2)
10000 TRNE TAC3,BNKOCC+NONOCC
10100 JRST NGHBO3 ;BLANK OR OFF-EDGE POINT
10200 MOVEI TAC1,177
10300 AND TAC1,TAC3
10400 HLL TAC3,STRPTR(TAC1)
10500 TDNN TAC3,NGHBOR-1
10600 JRST NGHBO2
10700 TLNE TAC3,3000
10800 JRST NGHBO3-1 ;ENDANG OR DEAD FRIENDLY
10900 JRST NGHBO3
11000 NGHBO2: TLNN TAC3,2000
11100 PUSHJ PDP,ADDSTR+1 ;ALIVE OR ENDANGERED ENEMY
11200 NGHBO3: SOJGE TAC2,NGHBO1
11300 PUSHJ PDP,CLLSTR
11400 ;*****SET UP CAPTURE EXCHANGE IF THERE IS ONE
11500 MOVE FRIEND,NGHBOR-1
11600 MOVEM CLEAR,NGHBOR-1 ;SAVE POSSIBLE ATARIED ENEMY
11700 MOVE SEARCH,-1(PDP)
11800 LDB TAC4,[POINT 9,STRPTR(SEARCH),35]
11900 SOJG TAC4,NGHBO5
12000 SETO BWREG, ;FINDND USES THIS REGISTER
12100 PUSHJ PDP,FINDND
12200 MOVE TAC,REGSTR+4 ;PROPOSED CAPTURE POINT
12300 PUSHJ PDP,LIBEST
12400 SKIPLE LIBVEC+1
12500 JRST NGHBO4-1 ;FOUND LEGAL CAPTURE
12600 ;*****SET UP EXTENSION OF ATARIED STRING
12700 NGHBO5: SKIPG SEARCH,NGHBOR-1
12800 JRST NGHBO4
12900 SETO BWREG,
13000 PUSHJ PDP,FINDND
13100 MOVE TAC,REGSTR+4
13200 PUSHJ PDP,LIBEST
13300 SOSLE LIBVEC+1 ;≤1 LIB FOR ENEMY?
13400 MOVEM TAC,EXMOVE
13500 NGHBO4: SKIPA 1,17 ;FOUND SOME AFFECTED STRINGS
13600 SETZ 1, ;FOUND ZERO OR TOO MANY STRINGS
13700 JRST NOFORC+2
13800
13900 ;**********
14000 ; NGHBR1 IS USED AFTER NGHBOR IN ORDER TO LOOK "BEHIND" STRINGS
14100 ;AFFECTED BY THE CURRENT MOVE. (CLEARLY, STRINGS WHICH CHANGE STATUS ARE
14200 ;THE ONES AFFECTED, AND ANY STRINGS BEHIND THESE STRINGS COULD ALSO
14300 ;BE AFFECTED.) NOTE LADEVAL IN GOEVAL MARKS STRINGS "SEEN" AS IT
14400 ;CHECKS STRING STATUS;
14500 ;**********
14600 0 ;HOLDS OLD END OF AFFECTED STRINGS
14700 ↑NGHBR1:MOVEM 16,R16SAV
14800 ;*****RESTORE AFFSTR FOR NEIGHS
14900 MOVE REPLCE,STRPTR
15000 MOVEM REPLCE,AFFSTR
15100 SETZ TAC3,
15200 MOVE TAC1,BRDDPY
15300 HRRM TAC1,NGHBR2
15400 NGHBR2: SKIPN TAC4,0(TAC3)
15500 JRST .+3 ;NO MORE FRIENDLIES
15600 MOVEM TAC4,AFFSTR+1(TAC3)
15700 AOJA TAC3,.-3
15800 HRRZ TAC1,NGHBR2
15900 CAME TAC1,BRDDPY
16000 JRST .+4
16100 MOVE TAC1,MSGDPY
16200 SUB TAC1,TAC3
16300 JRST NGHBR2-1
16400 MOVE FRIEND,NGHBOR-1
16500 SETZM AFFSTR+1(TAC3) ;MARK END OF STRINGS LIST
16600 MOVEM TAC3,NGHBR1-1 ;SAVE OLD END OF STRINGS LIST
16700 SUBI TAC3,MAXSTR+1
16800 MOVNM TAC3,BNDCNS
16900 MOVEI TAC3,LBSCUT+2
17000 MOVEM TAC3,LIBSNO
17100 ;*****EXPAND BEHIND AFFECTED STRINGS
17200 MOVEI 16,AFFSTR+1
17300 NGHBR3: SKIPN SEARCH,0(16)
17400 JRST NGHBR4
17500 TLZN SEARCH,2
17600 AOJA 16,NGHBR3
17700 MOVEM SEARCH,0(16)
17800 PUSHJ PDP,NEIGHS
17900 SKIPG BNDCNS
18000 JRST NGHBR5
18100 AOJA 16,NGHBR3
18200 NGHBR4: SETZ REPLCE,
18300 PUSHJ PDP,MRKNGH
18400 MOVE TAC1,NGHBR1-1
18500 SKIPN AFFSTR+1(TAC1)
18600 NGHBR5: TDZA 1,1 ;NO NEW STRINGS OR TOO MANY STRINGS
18700 PUSHJ PDP,CLLSTR
18800 MOVE 16,R16SAV
18900 POPJ PDP,
19000
19100 BEND
19200
19300
19400 ;**********ADD IN NEW STRING NAME, IF NOT DUPLICATED
19500 ADDSTR: LDB TAC1,[POINT 7,@GB1TST(TAC2),35] ;ENEMY NAME
19600 SKIPN TAC4,LIBSNO
19700 JRST CAPADD
19800 LDB TAC5,[POINT 9,STRPTR(TAC1),35] ;ENEMY LIBS
19900 CAMLE TAC5,TAC4
20000 POPJ PDP,
20100 SETZ TAC4, ;SEARCH FOR PRIOR OCCURRENCE
20200 CAPADD: SKIPG TAC5,AFFSTR(TAC4)
20300 JRST .+4
20400 CAIE TAC1,0(TAC5)
20500 AOJA TAC4,.-3
20600 POPJ PDP,
20700 MOVEM TAC1,AFFSTR(TAC4)
20800 SETZM AFFSTR+1(TAC4)
20900 SOS BNDCNS
21000 POPJ PDP,
21100
21200 ;**********
21300 ; COUNT THE NUMBER AND SAVE THE NAMES OF STRINGS ADJACENT TO STRING
21400 ;"SEARCH" WHICH HAVE ≤ NUMBER OF LIBERTIES SPECIFIED IN "LIBSNO". IF
21500 ;LIBSNO=0, THEN GET ALL STRINGS. AFFSTR, FRIEND, BNDCNS, SEARCH, LIBSNO
21600 ;MUST BE SET EXTERNALLY. IF SEARCH IS CONNECTED TO FRIENDLY THROUGH FALSE
21700 ;(OR REAL) EYE, COUNT THESE FRIENDLY STRINGS IN, TOO.
21800 ;**********
21900 0
22000 NEIGHS: MOVE TAC1,STRPTR(SEARCH)
22100 MOVEM FRIEND,NEIGHS-1
22200 TRNN TAC1,776
22300 SETZ FRIEND, ;ONE-LIB STRING CANT CONNECT TO FRIENDLIES
22400 PUSHJ PDP,STRSET
22500 MOVE TAC1,[PUSHJ PDP,CAPSTR]
22600 MOVEM TAC1,DRIVR1-3
22700 SETZM NOCONS ;COUNTS # CONNECTION POINTS
22800 MOVEI ENEMY,BLKOCC+WHTOCC
22900 TDZ ENEMY,GB1(TAC)
23000 PUSHJ PDP,CAPSTR
23100 MOVE FRIEND,NEIGHS-1
23200 ;*****GET RID OF POSSIBLE DUPLICATE CONNECTION COUNTS
23300 HRRZ TAC1,NOCONS ;# CONNECTIONS
23400 HLRZ TAC2,NOCONS ;# STRING STONES AT CONNECTIONS
23500 SUB TAC2,TAC1
23600 LSH TAC2,-1
23700 SUB TAC1,TAC2
23800 MOVEM TAC1,NOCONS
23900 POPJ PDP,
24000
24100 CAPSTR: SKIPG BNDCNS
24200 JRST ADLEND+1 ;MORE-THAN-20 CUTOFF
24300 MOVEI TAC2,3
24400 CAPST1: JUMPE FRIEND,CAPEND-2 ;DONT LOOK FOR CONNECTIONS
24500 TDNN BLANK,@GB1TST(TAC2)
24600 JRST CAPEND-2 ;NOT BLANK POINT
24700 MOVEI TAC1,NGHBTS*(WHTNGH+BLKNGH)
24800 AND TAC1,@GBDTST(TAC2)
24900 CAIE ENEMY,WHTOCC
25000 TRZA TAC1,BLKNGH*NGHBTS
25100 LSH TAC1,-4
25200 SOJLE TAC1,CAPEND ;LESS THAN TWO NEIGHS
25300 MOVEI TAC,@GODOWN(TAC2)
25400 MOVEI TAC3,3
25500 SETZM CONPNT+5 ;HOLDS "CONNECTED" 1-LIB STRING
25600 CAPST2: LDB TAC5,[POINT 7,@GB1TST(TAC3),35]
25700 SETZM CONPNT(TAC3)
25800 CAIN TAC5,177
25900 AOJA TAC1,CAPST3 ;ADD NEIGH FOR OFF-EDGE POINT
26000 JUMPE TAC5,CAPST3
26100 CAMN TAC5,SEARCH
26200 MOVE TAC5,REPLCE ;"SEARCH" IS DUMMY NAME
26300 HRRZ TAC4,STRPTR(TAC5)
26400 TDNN ENEMY,@GB1TST(TAC3)
26500 JRST CAPST4
26600 TRNN TAC4,776
26700 AOJA TAC1,CAPST3 ;ADD NEIGH FOR ATARIED ENEMY
26800 SUBI TAC1,=100 ;CANT BE A TIGERMOUTH CONNECTION
26900 JRST CAPST3
27000 CAPST4: TRNN TAC4,776
27100 JRST .+3
27200 MOVEM TAC5,CONPNT(TAC3)
27300 JRST CAPST3-2
27400 SKIPE CONPNT+5
27500 JRST CAPEND-3 ;TWO ATARIED STRINGS, NO CONNECTION
27600 MOVEM TAC5,CONPNT+5 ;SAVE ATARIED STRING NAME
27700 SOJ TAC1, ;SUB NEIGH FOR ATARIED FRIEND
27800 TRNN TAC4,776000
27900 SUBI TAC1,=100 ;THIS IS AT BEST A KO, NOT A CONNECTION
28000 CAMN REPLCE,TAC5
28100 SETOM CONPNT(TAC3) ;MARK CURRENT STRING LOCATION
28200 CAPST3: SOJGE TAC3,CAPST2
28300 CAIL TAC1,2
28400 JRST CAPST5+1 ;GOT CONNECTION
28500 MOVE TAC3,CONPNT
28600 MOVEM TAC3,CONPNT+4
28700 MOVE TAC3,CONPNT+3
28800 MOVEM TAC3,CONPNT-1
28900 MOVEI TAC1,3
29000 CAPST6: SKIPG CONPNT(TAC1)
29100 JRST CAPST5
29200 SKIPL CONPNT+1(TAC1)
29300 JRST .+3
29400 TDNE BLANK,@G1DIAG+1(TAC1)
29500 JRST CAPST5 ;THIS IS DIAGONALLY CONNECTED
29600 SKIPGE CONPNT-1(TAC1)
29700 TDNN BLANK,@G1DIAG(TAC1)
29800 SETZM CONPNT(TAC1) ;THIS STRING NOT CONNECTED
29900 CAPST5: SOJGE TAC1,CAPST6
30000 SKIPE TAC1,CONPNT+5
30100 PUSHJ PDP,CAPADD-1 ;CONSIDER ATARIED STRING "CONNECTED"
30200 SETZ TAC4,
30300 MOVEI TAC3,3
30400 SKIPLE TAC1,CONPNT(TAC3)
30500 PUSHJ PDP,CAPADD-1
30600 SOJGE TAC3,.-2
30700 JUMPE TAC4,CAPST7
30800 AOS NOCONS ;A CONNECTION WAS FOUND
30900 HRLZI TAC4,1
31000 MOVEI TAC3,3
31100 SKIPGE CONPNT(TAC3)
31200 ADDM TAC4,NOCONS ;# STRING STONES AT CONNECTION
31300 SOJGE TAC3,.-2
31400 CAPST7: MOVEI TAC,@GODOWN+2(TAC2)
31500 TDNE ENEMY,@GB1TST(TAC2)
31600 PUSHJ PDP,ADDSTR
31700 CAPEND: SOJGE TAC2,CAPST1
31800 JRST ADLEND+1
31900
32000 ;**********
32100 ; SAVE THE LOCATIONS OF LIBERTIES OF THE STRING "SEARCH".
32200 ;BNDCNL AND SEARCH MUST BE SET EXTERNALLY.
32300 ;**********
32400 LBSGET: SETZ FRIEND, ;USED BY PLAYFS
32500 PUSHJ PDP,STRSET
32600 LDB TAC5,[POINT 9,STRPTR(REPLCE),35]
32700 MOVEM TAC5,NOLIBS ;# LIBERTIES IN STRING
32800 MOVE TAC1,[PUSHJ PDP,LIBSTR]
32900 MOVEM TAC1,DRIVR1-3
33000 LIBSTR: JUMPE TAC5,ADLEND+1 ;ARE THERE MORE LIBS
33100 SKIPG BNDCNL
33200 JRST ADLEND+1
33300 MOVEI TAC2,3
33400 TDNN BLANK,@GB1TST(TAC2)
33500 JRST LIBNDR
33600 MOVEI TAC1,@GODOWN(TAC2) ;LOCATION OF BLANK
33700 MOVEI TAC3,AFFMOV
33800 SKIPN TAC4,0(TAC3)
33900 JRST LIBADD
34000 CAIE TAC1,0(TAC4) ;SEEN THIS ONE YET?
34100 AOJA TAC3,.-3
34200 JRST LIBNDR-2
34300 LIBADD: SOS BNDCNL ;REDUCE # AVAILABLE LIBERTY SLOTS
34400 PUSHJ PDP,TACMR1
34500 MOVEM TAC1,0(TAC3) ;SAVE LIB LOCATION
34600 SETZM 1(TAC3)
34700 SOJ TAC5, ;SUBTRACT ONE LIB COUNT
34800 ORM FRIEND,0(TAC3) ;NEXT TO TARGET, NEXT TO CHASER
34900 JUMPE TAC5,ADLEND+1 ;JUMP IF NO MORE LIBS
35000 LIBNDR: SOJGE TAC2,LIBSTR+4
35100 JRST ADLEND+1
35200
35300 ;**********
35400 ; FIND THE OTHER END OF THE TWO-LIB STRING WE HAVE JUST ATTACKED.
35500 ;THIS OTHER LIBERTY WILL BE EXAMINED TO SEE IF THE PROPOSED MOVE IS IN FACT
35600 ;A FORCED CAPTURE.
35700 ;**********
35800 FINDND: PUSHJ PDP,STRSET
35900 MOVE TAC1,[PUSHJ PDP,FNDEND]
36000 MOVEM TAC1,DRIVR1-3
36100 SETZM REGSTR+4
36200 FNDEND: SKIPE REGSTR+4
36300 JRST ADLEND+1
36400 MOVEI TAC1,3
36500 TDNN BLANK,@GB1TST(TAC1)
36600 JRST FNDEN1
36700 MOVEI TAC2,@GODOWN(TAC1)
36800 CAIN TAC2,0(BWREG) ;IS THIS THE CURRENT MOVE WE
36900 JRST FNDEN1 ;ARE JUST PROPOSING?
37000 MOVEM TAC2,REGSTR+4 ;SAVE OTHER END BLANK ADDRESS
37100 ADDI TAC1,2
37200 CAIL TAC1,4
37300 SUBI TAC1,4
37400 MOVEM TAC1,REGSTR+5
37500 JRST ADLEND+1
37600 FNDEN1: SOJGE TAC1,FNDEND+3
37700 JRST ADLEND+1
37800
37900 ;**********
38000 ; SETS UP FOR RECURSION ON STRINGS. THIS ROUTINE IS COMMON TO
38100 ;ALMOST EVERY STRING-PROCESSING FUNCTION IN THE PROGRAM.
38200 ;**********
38300 STRSET: MOVEI BLANK,BNKOCC
38400 SKIPN REPLCE,STRPTR
38500 SAILERR <1> ;******** ERROR MESSAGE 1 ********
38600 LDB TAC,[POINT 9,STRPTR(SEARCH),17] ;GET BASE POINT
38700 CAIL TAC,BRDWTH
38800 CAIL TAC,BRDWTH*(BRDWTH-1)
38900 SAILERR <2> ;******** ERROR MESSAGE 2 ********
39000 MOVEM TAC,TACSAV
39100 MOVEI CLEAR,STRBTS*STRCNT
39200 PUSHJ PDP,DRIVER ;MARK STRING POINTS
39300 EXCH SEARCH,REPLCE
39400 MOVE TAC,TACSAV
39500 POPJ PDP,
00100 ;*********
00200 ; HANDLE THE CASE WHERE THE FORCING SIDE WANTS TO PLAY NEXT
00300 ;TO A SELF-ATARI POINT SO THAT HE CAN THEN PLAY ON THE SELF-ATARI
00400 ;POINT NEXT TIME. THERE ARE TWO CASES...
00500 ; 1. PLAYING ON SELF-ATARI POINT ENDANGERS FORCER STONES
00600 ; 2. PLAYING ON SELF-ATARI POINT CAN LOSE ONLY ONE STONE
00700 ;*********
00800 CONSTR: TLNN BWREG,CONTGT+NXTTGT
00900 JRST NONIL1 ;POINT DOES NOT AFFECT TARGET
01000 SKIPN TAC3,FSLIBS+4
01100 JRST CNSTR2 ;NO TWO-LIB FORCERS
01200 CAILE TAC3,177
01300 JRST NONIL1 ;MORE THAN ONE TWO-LIB FORCER
01400 ;*****MAKE SURE STRING IS ON THE AFFECTED STRINGS LIST
01500 MOVEI TAC1,AFFSTR+1
01600 HRRZ TAC4,0(TAC1)
01700 JUMPE TAC4,REPLAY-3 ;FORCER STRING NOT ON AFFECTED LIST
01800 CAME TAC3,TAC4
01900 AOJA TAC1,.-3
02000 ;*****FIND LIBERTY AT "OTHER END" OF THIS STRING
02100 MOVEI TAC1,AFFMOV
02200 CNSTR1: HRRZ TAC,0(TAC1)
02300 JUMPE TAC,CNSTR4 ;THIS SHOULD BE VERY RARE
02400 CAIN TAC,0(BWREG)
02500 AOJA TAC1,CNSTR1 ;CURRENT POINT
02600 MOVEI TAC5,3
02700 LDB REPLCE,[POINT 7,@GB1TST(TAC5),35]
02800 CAMN TAC3,REPLCE
02900 JRST CNSTR3 ;FOUND OTHER END OF STRING
03000 SOJGE TAC5,.-3
03100 AOJA TAC1,CNSTR1
03200 ;*****TAKE CARE OF CASE 2...
03300 CNSTR2: SKIPE FSLIBS+3
03400 JRST NONIL1 ;NEXT TO ATARIED STRING
03500 MOVEI BLANK,BNKOCC
03600 MOVEI TAC1,3
03700 TDNE BLANK,@GB1TST(TAC1)
03800 JRST CNST22
03900 SOJGE TAC1,.-2
04000 TLNN BWREG,CAPENM
04100 SAILERR <3> ;IMPOSSIBLE ******* ERROR MESSAGE 3 *******
04200 JRST NONIL1
04300 CNST22: MOVEI TAC,@GODOWN(TAC1)
04400 ;*****FIND WHICH PROPOSED MOVE HELPS PLAY AT SELF-ATARI POINT
04500 MOVEI TAC1,AFFMOV
04600 SKIPN TAC4,0(TAC1)
04700 JRST CNSTR4
04800 CAIE TAC,0(TAC4)
04900 AOJA TAC1,.-3
05000 CNSTR3: MOVEI TAC5,HLPSTR ;SET POSSIBLE HELPER BIT
05100 ORM TAC5,AUXBTS-AFFMOV(TAC1)
05200 HRRZ TAC,BWREG
05300 JRST NONIL1
05400 CNSTR4: MOVEM TAC,0(TAC1)
05500 SETZM 1(TAC1)
05600 SOSG BNDCNL
05700 JRST LEXCSS
05800 PUSHJ PDP,TACMRK
05900 JRST CNSTR3
06000
06100 ;**********
06200 ; A NEW WEAK NON-TARGET STRING HAS BEEN FOUND, SO RESTART THE
06300 ;PREDICTION ANALYSIS AFTER INCLUDING THE NEW STRING.
06400 ;**********
06500 MOVE TAC,TAC1
06600 MOVE SEARCH,TAC3
06700 JRST REPLAY+3
06800 REPLAY: MOVEI TAC,AFFSTR+2 ;WE HAVE JUST FOUND ANOTHER WEAK CHASING
06900 SKIPE 0(TAC) ;STRING, SO MUST START OVER AT ENMYCP WITH
07000 AOJA TAC,.-1 ;THIS ADDITION TO AFFECTED STRINGS LIST
07100 SOSG BNDCNS
07200 JRST SEXCSS ;TOO MANY STRINGS
07300 MOVEM SEARCH,0(TAC)
07400 SETZM 1(TAC)
07500 AOJ TAC, ;MAKE SURE NEW STRING WILL BE WKNTGT
07600 HRRM TAC,CONREC ;ALLOW THIS WKNTGT TO COLLECT NEIGHBORS
07700 MOVEI TAC1,AFFMOV ;RESET PROPOSED MOVE BITS TO INITIAL STATE
07800 HRLOI TAC2,WKNTGT+NXTTGT+CONTGT
07900 SKIPN 0(TAC1)
08000 JRST ENMYCP-1
08100 SKIPGE 0(TAC1)
08200 SOS BNDCNL ;ILLEGAL MOVE IS TEMPORARILY LEGAL AGAIN
08300 ANDM TAC2,0(TAC1)
08400 AOJA TAC1,.-5
08500
08600 ;**********
08700 ; THIS ABNORMAL EXIT CODE IS USED TO STOP THE ANALYSIS WHEN AN
08800 ;EXCEPTIONAL CONDITION IS FOUND. THE IDEA IS TO IDENTIFY THE EXCEPTION
08900 ;BY THE POINT IT OCCURS AT AND/OR THE CODE NUMBER OF WHAT HAPPENED.
09000 ;**********
09100 LEXCSS: SKIPA TAC5,[-6]
09200 SEXCSS: MOVNI TAC5,5
09300 MOVEM TAC5,KFOR
09400 POP PDP,ZER
09500 JRST NOFORC
09600 STOPIT: HRRZM BWREG,IFORCE ;SAVE MOVE ADDRESS
09700 JRST SEXCSS+1
09800
09900 ;*****CHECK STRING NAME TO SEE IF IT IS NEW TO THE TARGET COMPLEX. IF
10000 ;*****SO, ADD STRING NAME TO NWSTRG AND RETURN TAC4≠0. NOTE SEARCH
10100 ;*****MUST HAVE STRING NAME IN IT.
10200 NWSTRG: BLOCK 11
10300 NEWSTR: MOVEI TAC4,1
10400 SKIPN AFFSTR(TAC4)
10500 JRST NEWST1+1
10600 CAME SEARCH,AFFSTR(TAC4)
10700 AOJA TAC4,.-3
10800 SETZ TAC4,
10900 NEWST1: POPJ PDP,
11000 MOVEI TAC4,NWSTRG
11100 SKIPN 0(TAC4)
11200 JRST .+5
11300 CAMN SEARCH,0(TAC4)
11400 JRST NEWST1-1
11500 CAIE TAC4,NWSTRG+7
11600 AOJA TAC4,NEWST1+2
11700 MOVEM SEARCH,0(TAC4)
11800 SETZM 1(TAC4)
11900 JRST NEWST1
12000
12100 ;**********
12200 ; THE IDEA HERE IS TO ESTIMATE THE NUMBER OF LIBERTIES A
12300 ;CAPTURE OF THE STRING "SEARCH" WOULD ADD. IT IS IMPORTANT TO
12400 ;INCLUDE LIBERTIES OF ALL STRINGS WHICH WOULD BECOME CONNECTED
12500 ;THROUGH THE CAPTURE (BUT WHICH ARE NOT ALREADY CONNECTED).
12600 ;**********
12700 NEWADD: MOVEI TAC2,3
12800 TDNN BLANK,@GB1TST(TAC2)
12900 JRST NEWAD1
13000 MOVEI TAC,@GODOWN(TAC2)
13100 CAIN TAC,0(BWREG)
13200 JRST NEWAD1-1 ;THIS IS CURRENT MOVE POINT
13300 MOVE TAC3,TGLIBS
13400 HRRZ TAC1,AFFMOV-1(TAC3)
13500 CAIN TAC1,0(TAC)
13600 JRST NEWAD1-1 ;BLANK POINT ALREADY NXTTGT
13700 SOJG TAC3,.-3
13800 MOVEM TAC2,TEMP2
13900 MOVEI TAC2,3
14000 NEWAD2: MOVE TAC1,@GB1TST(TAC2)
14100 TRNE TAC1,BNKOCC
14200 AOS NOLIBS ;BLANK NEXT TO BLANK
14300 TRNN TAC1,BLKOCC+WHTOCC
14400 JRST NEWAD4
14500 ANDI TAC1,177
14600 LDB TAC3,[POINT 9,STRPTR(TAC1),35]
14700 TDNE ENEMY,@GB1TST(TAC2)
14800 JRST NEWAD3
14900 CAME TAC1,SEARCH ;CURRENT STRING?
15000 CAMN TAC1,REPLCE
15100 JRST NEWAD4
15200 CAILE TAC3,2
15300 JRST NEWAD4
15400 SOJG TAC3,NEWAD2+2 ;THREAT
15500 LDB TAC3,[POINT 9,STRPTR(TAC1),26]
15600 JRST NEWAD4-1 ;CAPTURES ANOTHER STRING ALSO
15700 NEWAD3: SOJLE TAC3,NEWAD4 ;ELIM 1-LIB STRINGS
15800 EXCH SEARCH,TAC1
15900 PUSHJ PDP,NEWSTR
16000 EXCH SEARCH,TAC1
16100 SKIPN TAC4
16200 SOSA NOLIBS ;NOT NEW STRING
16300 ADDM TAC3,NOLIBS
16400 NEWAD4: SOJGE TAC2,NEWAD2
16500 MOVE TAC2,TEMP2
16600 MOVEI TAC,@GODOWN+2(TAC2)
16700 NEWAD1: TDNN ENEMY,@GB1TST(TAC2)
16800 JRST NEWAD5
16900 LDB TAC1,[POINT 7,@GB1TST(TAC2),35]
17000 LDB TAC3,[POINT 9,STRPTR(TAC1),35]
17100 SOJLE TAC3,NEWAD5 ;ELIM 1-LIB STRINGS
17200 EXCH SEARCH,TAC1
17300 PUSHJ PDP,NEWSTR
17400 EXCH SEARCH,TAC1
17500 SKIPE TAC4
17600 ADDM TAC3,NOLIBS
17700 NEWAD5: SOJGE TAC2,NEWADD+1
17800 JRST ADLEND+1
17900
18000 ;*****SETUP CODE FOR THE NEWADD LEAF
18100 NOCAPW: SETZM NOLIBS ;HOLDS # LIBS FOUND
18200 PUSHJ PDP,STRSET
18300 MOVE TAC1,[PUSHJ PDP,NEWADD]
18400 MOVEM TAC1,DRIVR1-3
18500 MOVEI ENEMY,BLKOCC+WHTOCC
18600 TDZ ENEMY,GB1(TAC)
18700 MOVEI TAC1,NWSTRG
18800 SKIPE 0(TAC1)
18900 AOJA TAC1,.-1
19000 HRRM TAC1,.+2 ;SAVE LOCATION OF END OF NEW STRINGS LIST
19100 PUSHJ PDP,NEWADD
19200 SETZM 0 ;GET RID OF ANY NEW NEW STRINGS
19300 POPJ PDP,
19400
19500 ;**********
19600 ; MARK GBOARD POINT AS PART OF THE TACTICAL ANALYSIS. WE EXPECT
19700 ;TAC TO CONTAIN THE ADDRESS OF THE POINT TO BE MARKED.
19800 ;**********
19900 TACBIT
20000 TACMRK: SKIPN STRRST
20100 POPJ PDP, ;DONT MARK NOW
20200 EXCH TAC3,TACMRK-1
20300 ORM TAC3,GBOARD(TAC)
20400 EXCH TAC3,TACMRK-1
20500 POPJ PDP,
20600 TACMR1: SKIPN STRRST
20700 POPJ PDP, ;DONT MARK NOW
20800 EXCH TAC3,TACMRK-1
20900 ORM TAC3,GBOARD(TAC1)
21000 EXCH TAC3,TACMRK-1
21100 POPJ PDP,
21200
21300 ;**********
21400 ; FIND NXTTGT ∨ CONTGT POINT ADJACENT TO THE CURRENT POINT. NOTE THE
21500 ;CONTGT POINT CANT BE A "NEW" CONTGT. IF TAC5≠0 THEN SUCCESS.
21600 ;**********
21700 NXCSRC: MOVEI TAC4,AFFMOV
21800 SKIPN TAC5,0(TAC4)
21900 POPJ PDP, ;FAILURE RETURN
22000 TLNN TAC5,NXTTGT+CONTGT
22100 AOJA TAC4,NXCSRC+1
22200 HLL TAC5,AUXBTS-AFFMOV(TAC4)
22300 TLNE TAC5,NEWCGT
22400 AOJA TAC4,NXCSRC+1
22500 HRRZ TAC5,TAC5
22600 SUB TAC5,TAC
22700 MOVM TAC5,TAC5
22800 CAIE TAC5,BRDWTH
22900 CAIN TAC5,1
23000 POPJ PDP,
23100 AOJA TAC4,NXCSRC+1
00100 BEGIN LADRES
00200
00300 ;**********
00400 ; CHECK A CAPTURED STRING TO SEE IF THIS CAPTURE SAVES SOME
00500 ;FRIENDLY STRING ON THE OTHER SIDE OF THE CAPTURE. SEARCH IS NAME OF
00600 ;CAPTURED STRING, FRIEND IS SET TO CAPTURING SIDE. TAC3 MUST BE SET
00700 ;TO (# STRING LIBS) - 1.
00800 ;NOLIBS=0 MEANS THIS MOVE CONCERNS THE AFFECTED STRINGS LIST.
00900 ;IF TEMP1≠0 THEN SAVING DIDNT HAPPEN ... TEMP1>0 MEANS ANOTHER WEAKER
01000 ;STRING NEARBY, TEMP1<0 MEANS NO WEAK STRINGS AROUND. RIGHT HALF OF
01100 ;TEMP3 HOLDS THE NAME OF THE SAVED STRING, IF ANY.
01200 ;**********
01300 NEIGH1: PUSHJ PDP,STRSET+1
01400 MOVE TAC1,[PUSHJ PDP,CNTSTR]
01500 MOVEM TAC1,DRIVR1-3
01600 SETOM TEMP1
01700 SETZM TEMP3
01800 SETOM NOLIBS
01900 TLNE BWREG,NXTTGT+CONTGT
02000 SETZM NOLIBS
02100 CNTSTR: MOVEI TAC1,3
02200 TDNN FRIEND,@GB1TST(TAC1)
02300 JRST CNTST1
02400 LDB TAC2,[POINT 7,@GB1TST(TAC1),35]
02500 HRRZ TAC5,CONREC ;ADDR PAST END OF RELEVANT STRINGS
02600 SUBI TAC5,AFFSTR+1
02700 CAMN TAC2,AFFSTR(TAC5)
02800 SETZM NOLIBS ;TARGET COMPLEX STRING AFFECTED
02900 SOJG TAC5,.-2
03000 CNTST3: LDB TAC4,[POINT 9,STRPTR(TAC2),35]
03100 CAILE TAC4,2
03200 JRST CNTST1
03300 CAIGE TAC4,1(TAC3) ;IS THIS SURROUNDING STRING TOO WEAK
03400 MOVEM TAC,TEMP1 ;*** THIS IS THE FAILURE CASE.
03500 SOJG TAC4,CNTST4 ;TWOLIBBER CANT BECOME AN EYE
03600 HRRM TAC2,TEMP3 ;ATARIED STRING SAVED
03700 CNTST4: SKIPL TEMP1
03800 JRST CNTST1 ;DONT DESTROY FAILURE MARK
03900 CAMN TAC3,TAC4
04000 SETZM TEMP1
04100 CNTST1: SOJGE TAC1,CNTSTR+1
04200 JRST ADLEND+1
04300
04400 ;**********
04500 ; IF STRING SEARCH CANT ESCAPE BY CAPTURING A NEIGHBORING
04600 ;STRING, ADD ITS STONES TO THE NUMBER OF CAPTURES.
04700 ;**********
04800 LADADD: MOVEM TAC4,REGSTR+11
04900 PUSHJ PDP,NEIGH1
05000 SKIPLE TEMP1
05100 JRST .+3 ;STRING CAN GET AWAY
05200 LDB TAC5,[POINT 9,STRPTR(REPLCE),26]
05300 ADDM TAC5,REGSTR+10 ;INCREASE THE "BAG"
05400 MOVE TAC,REGSTR+4
05500 SKIPN TAC1,REGSTR+5
05600 MOVEI TAC1,4
05700 MOVE TAC4,REGSTR+11
05800 POPJ PDP,
05900
06000 ;**********
06100 ; THIS ROUTINE ADDS TO TAC4 THE NUMBER OF LIBERTIES GAINED BY THE
06200 ;TARGET STRING WHEN IT PLAYS NEXT TO ANOTHER STRING
06300 ;**********
06400 0 ;HOLDS # ATARIED FRIENDLIES
06500 ENMCNT: TDNE REPLCE,FRIEND
06600 JRST FRDCNT
06700 ANDI REPLCE,177
06800 CAME REPLCE,BLANK
06900 CAMN REPLCE,CLEAR
07000 JRST ENMCN1-1 ;THESE LIBS ALREADY COUNTED
07100 CAMN REPLCE,REGSTR+6
07200 JRST ENMCN1-1 ;THIS IS TARGET STRING
07300 LDB TAC3,[POINT 9,STRPTR(REPLCE),35]
07400 SKIPE ZER
07500 PUSHJ PDP,LIBFIX
07600 SOJG TAC3,ENMCN1
07700 MOVE SEARCH,REPLCE
07800 PUSHJ PDP,LADADD ;ADD ANY STONES WHICH WILL ALSO GET CAPTURED
07900 TDZA TAC3,TAC3
08000 ENMCN1: ADD TAC4,TAC3
08100 POPJ PDP,
08200 FRDCNT: ANDI REPLCE,177
08300 HRRZ TAC3,STRPTR(REPLCE)
08400 SKIPN ZER
08500 PUSHJ PDP,LIBFIX
08600 TRNE TAC3,776
08700 JRST FRDCN1
08800 LSH TAC3,=-9 ;# CAPTURED FRIENDLY STONES
08900 JRST ENMCN1
09000 FRDCN1: TRNE TAC3,775
09100 JRST ENMCN1-1 ;FRIENDLY HAS ≥2 LIBS
09200 LSH TAC3,-=9
09300 ADDM TAC3,ENMCNT-1 ;HOLDS # ATARIED FRIENDLIES
09400 JRST ENMCN1-1
09500 LIBFIX: MOVEI TAC5,GRUPNO ;WHEN STRING IS NEXT TO ENEMY PROPOSED MOVE
09600 SKIPN 0(TAC5) ;IT HAS ONE FEWER LIB THAN IS RECORDED IN
09700 POPJ PDP, ;THE STRING DATA
09800 CAME REPLCE,0(TAC5)
09900 AOJA TAC5,.-3
10000 SUBI TAC3,1 ;STRING NEXT TO PROPOSED CHASER MOVE
10100 POPJ PDP,
10200
10300 ;**********
10400 ; ERASE 7-BIT ASCII NAME (IN SEARCH) FROM TAC4. NOTE TAC1 AND
10500 ;TAC5 ARE DESTROYED AND PROGRAM BLOWS UP IF SEARCH NOT IN TAC4.
10600 ;**********
10700 DELNAM: MOVEI TAC1,177
10800 AND TAC1,TAC4
10900 LSHC TAC4,-7 ;SAVE PART OF TAC4 IN TAC5
11000 CAMN SEARCH,TAC1
11100 JRST DELNA1
11200 PUSHJ PDP,DELNAM
11300 LSHC TAC4,7
11400 POPJ PDP,
11500 DELNA1: LSH TAC5,7 ;DESTROY LAST NAME SAVED
11600 POPJ PDP,
11700
11800 ;**********
11900 ; THIS CODE LOOKS ALONG THE EDGE OF THE BOARD TO SEE IF THERE IS
12000 ;A FORCED CAPTURE POSSIBLE BY RUNNING THE STRING BEING CHASED INTO THE
12100 ;CORNER OR INTO SOME OTHER CHASING STONES.
12200 ;**********
12300 TRYEDG: HRRE TAC4,GODOWN+2(TAC1)
12400 SKIPN REGSTR+7
12500 MOVEI TAC3,3(TAC1) ;REGISTERS NOT SWAPPED
12600 SKIPE REGSTR+7
12700 MOVEI TAC3,1(TAC1) ;REGS SWAPPED
12800 CAIL TAC3,4
12900 SUBI TAC3,4
13000 ADD TAC,TAC4
13100 ;**********
13200 ; LOOK ALONG THE EDGE OF THE BOARD TO SEE IF THERE IS A LADDER.
13300 ;NOTE TAC, ENEMY, FRIEND, TAC3, AND TAC4 MUST BE PRESET.
13400 ;*********
13500 EDGLAD: MOVE SEARCH,GB1(TAC) ;LOOK AT LINE 1 POINT
13600 TRNE SEARCH,NONOCC
13700 JRST CAPTUR ;LADDER WORKED
13800 TRNE SEARCH,BNKOCC
13900 JRST EABLNK ;LINE 1 POINT IS BLANK
14000 MOVE TAC1,SEARCH
14100 ANDI SEARCH,177
14200 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
14300 TDNE TAC1,FRIEND
14400 JRST EGOODG
14500 CAILE TAC5,2
14600 JRST NOTLAD ;STRING SAVED BY FRIENDLY
14700 CAIG TAC5,1
14800 JRST CAPTUR ;LADDER WORKED
14900 JRST NOGOOD ;CANT TELL IF WORKED OR NOT
15000 EGOODG: CAILE TAC5,1
15100 JRST CAPTUR ;LADDER WORKED
15200 MOVE SEARCH,@GB1TST(TAC3) ;SEE IF CAPTURED FRIENDLY CAN
15300 TDNN SEARCH,ENEMY ;PERHAPS NOT BE DISCOURAGING
15400 JRST NOTLAD
15500 ANDI SEARCH,177
15600 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
15700 CAILE TAC5,1
15800 JRST NOTLAD ;TARGET-SIDE CAPTURER HAS TOO MANY LIBS
15900 JRST NOGOOD ;CANT TELL
16000 EABLNK: MOVE SEARCH,@GB1TST(TAC3)
16100 PUSHJ PDP,TACMRK
16200 TRNN SEARCH,BNKOCC
16300 JRST EABLN1
16400 MOVEI TAC1,@GODOWN(TAC3)
16500 PUSHJ PDP,TACMR1
16600 ADD TAC,TAC4 ;LINE 2 POINT BLANK, TOO SO GO ON
16700 JRST EDGLAD
16800 EABLN1: MOVE TAC1,SEARCH
16900 ANDI SEARCH,177
17000 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
17100 TDNE TAC1,FRIEND
17200 JRST CAPTUR ;LADDER WORKED
17300 CAILE TAC5,3
17400 JRST NOTLAD ;STRING SAVED BY FRIENDLY
17500 CAILE TAC5,2
17600 JRST NOGOOD ;CANT TELL IF LADDER WORKED
17700 JRST CAPTUR ;LADDER WORKED
17800
17900 ;*****TABLES USED TO ADJUST TAC3, TAC4 DURING GENERAL LADDER ANALYSIS
18000 T3TABL: 2
18100 3
18200 0
18300 1
18400 T4TABA: 3
18500 2
18600 1
18700 0
18800 T4TABB: 1
18900 0
19000 3
19100 2
19200
19300 ;**********
19400 ; THIS CODE CHECKS TO SEE IF A STRING CAN BE CAPTURED THROUGH A LADDER
19500 ;ACROSS THE BOARD. A SUCCESSFUL CAPTURE COMES FROM RUNNING THE ATTACKED
19600 ;STRING INTO THE EDGE OR INTO SOME OTHER CHASING STONES.
19700 ;**********
19800 TRYLAD: SKIPN REGSTR+7
19900 HRRE TAC5,GODOWN+1(TAC1) ;REGS NOT SWAPPED
20000 SKIPE REGSTR+7
20100 HRRE TAC5,GODOWN+3(TAC1) ;REGS SWAPPED
20200 MOVEI TAC4,@GODOWN(TAC1) ;LOCATION OF ENEMY STRING
20300 SUB TAC4,TAC5 ;ADDR OF WHERE OTHER FRIENDLY MUST BE
20400 MOVE REPLCE,GB1(TAC4)
20500 TRNE REPLCE,BNKOCC
20600 JRST .+3 ;PROPOSED MOVE POINT
20700 ANDI REPLCE,177
20800 LDB TAC3,[POINT 9,STRPTR(REPLCE),35]
20900 CAIL TAC3,3
21000 JRST TRYLA1
21100 SOJLE TAC3,NOTLAD
21200 MOVE TAC3,TAC4 ;IS TWO-LIB MOVE AGAINST EDGE...
21300 SUB TAC3,TAC5 ;IF SO, THEN CAN CONTINUE WITH LADDER
21400 MOVE TAC3,GB1(TAC3)
21500 TRNN TAC3,NONOCC
21600 JRST TRYSNP
21700 TRYLA1: MOVEI TAC3,3
21800 MOVEI TAC1,@G1DIAG(TAC3) ;FIND CORRECT VALUE FOR TAC3
21900 CAIE TAC1,GB1(TAC4)
22000 SOJGE TAC3,.-2
22100 SUB TAC4,REGSTR+4 ;TAC4 DIAG OFFSET OF "OTHER" FRIENDLY
22200 MOVM TAC4,TAC4 ;USE DIAG OFFSET TO GET TAC4 TABLE
22300 CAIG TAC4,BRDWTH-1
22400 SKIPA TAC1,[T4TABB]
22500 MOVEI TAC1,T4TABA
22600 HRRM TAC1,T4SETT ;TAC4 TABLE SET UP NOW
22700 MOVEI TAC4,3
22800 HRRE TAC1,GODOWN(TAC4) ;FIND CORRECT VALUE FOR TAC4
22900 CAME TAC5,TAC1
23000 SOJGE TAC4,.-2
23100 MOVE TAC1,@T4SETT ;GET OUT-OF-PHASE TAC4 VALUE
23200 MOVEI TAC,@GODOWN+2(TAC1) ;THIS VALUE INITIALIZES BASE POINT
23300 ;**********
23400 ; LOOK DOWN THE PATH OF A LADDER TO SEE IF IT WILL WORK. NOTE
23500 ;TAC,TAC3,TAC4,FRIEND MUST BE PRESET.
23600 ;**********
23700 BRDLAD: MOVE SEARCH,GB1(TAC) ;LOOK AT CENTER OF TRIPLE
23800 TRNE SEARCH,NONOCC
23900 JRST CAPTUR ;LADDER WORKED
24000 TRNE SEARCH,BNKOCC
24100 JRST BBBLNK ;CENTER POINT BLANK
24200 MOVE TAC1,SEARCH
24300 ANDI SEARCH,177
24400 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
24500 TDNE TAC1,FRIEND
24600 JRST BGOODG
24700 CAILE TAC5,2
24800 JRST NOTLAD ;STRING SAVED BY FRIENDLY
24900 CAIG TAC5,1
25000 JRST CAPTUR ;LADDER WORKED
25100 JRST NOGOOD ;CANT TELL
25200 BGOODG: CAILE TAC5,1
25300 JRST CAPTUR
25400 JRST NOGOOD
25500 BBBLNK: MOVE SEARCH,@G1DIAG(TAC3)
25600 PUSHJ PDP,TACMRK
25700 TRNE SEARCH,NONOCC
25800 JRST CAPTUR ;LADDER WORKED
25900 TRNE SEARCH,BNKOCC
26000 JRST BABLNK ;BOTH CENTER POINTS BLANK
26100 MOVE TAC1,SEARCH
26200 ANDI SEARCH,177
26300 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
26400 TDNE TAC1,FRIEND
26500 JRST BGOODG
26600 CAILE TAC5,3
26700 JRST NOTLAD ;LADDER FAILED
26800 CAILE TAC5,2
26900 JRST NOGOOD ;CANT TELL
27000 JRST CAPTUR ;LADDER WORKED
27100 BABLNK: MOVE SEARCH,@GB1TST(TAC4)
27200 MOVEI TAC1,@G1DIAG(TAC3)
27300 SUBI TAC1,GB1
27400 PUSHJ PDP,TACMR1
27500 TRNN SEARCH,BNKOCC
27600 JRST T4SETT+2
27700 BABLN1: MOVEI TAC1,@GODOWN(TAC4)
27800 PUSHJ PDP,TACMR1
27900 MOVEI TAC,@GODOWN+2(TAC4)
28000 MOVEI TAC,@G1DIAG(TAC3)
28100 SUBI TAC,GB1 ;TAC IS NOW READY FOR THE NEXT TRIPLE
28200 MOVE TAC3,T3TABL(TAC3)
28300 T4SETT: MOVE TAC4,0(TAC4) ;SET BY GENERAL LADDER SETUP
28400 JRST BRDLAD ;TRY NEXT TRIPLE
28500 MOVE TAC1,SEARCH
28600 ANDI SEARCH,177
28700 TDNE TAC1,FRIEND
28800 JRST BABLN1 ;GO TO NEXT TRIPLE
28900 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
29000 CAILE TAC5,1
29100 JRST NOTLAD
29200 JRST BABLN1
29300
29400 ;**********
29500 ; WHEN A STRING IS IN FACT CAPTURABLE BY LADDER OR SNAPBACK, WE MUST
29600 ;RECORD THIS FACT AND ADJUST THE DATA BASE ACCORDINGLY. CAPTUR DOES QUITE
29700 ;DIFFERENT THINGS DEPENDING ON THE KIND OF CAPTURE DISCOVERED.
29800 ;**********
29900 CAPTUR: MOVE SEARCH,REGSTR+6
30000 LDB TAC4,[POINT 9,STRPTR(SEARCH),26]
30100 ADD TAC4,REGSTR+10 ;POSSIBLE "EXTRA" CAPTURES
30200 JUMPN ZER,CAPTU1
30300 MOVEI TAC1,777777 ;TAC1>0 MEANS LADDER INEVITABLE
30400 CAPLOS: CAME FRIEND,NFRND ;*****SEE IF LOSING LADDER IS A LOSS
30500 JRST CAPTU2
30600 ADDM TAC4,TCMPLX ;DEAD CHASER STONES IMPLY STRONGER TARGET
30700 SKIPE FORSAV
30800 BADLA1: TLOA 16,LADLSN ;BAD LADDER EXTENSION FOR NON-MOVER
30900 TLO 16,LADLSM ;BAD LADDER EXTENSION FOR MOVER
31000 JRST NOTLA1
31100 ADDM FRIEND,MSTSAV ;SAVER MUST AVOID LADDER
31200 BADLAD: SKIPN FORSAV
31300 JRST BADLA1
31400 JRST BADLA1+1
31500 CAPTU2: CAME SEARCH,AFFSTR+1
31600 JRST BADLAD ;DONT EXTEND LOSING LADDER
31700 SKIPE FORSAV
31800 JUMPLE TAC1,BADLAD-1 ;LADDER MAY NOT BE INEVITABLE
31900 CAPT22: MOVEI TAC5,2 ;THIS IS AN INSTANT WIN FOR FORCER
32000 JRST STOPIT
32100 CP2000: TRO 16,LADLOS
32200 SKIPLE REGSTR+12
32300 TLO 16,SNACPN ;CAPTURE BY NON-MOVER BY SNAPBACK
32400 MOVEI TAC5,AFFMOV
32500 CP2001: HRRZ TAC2,0(TAC5)
32600 JUMPN TAC2,CP2003
32700 SKIPE FORSAV
32800 JRST CP2002
32900 POP PDP,TAC
33000 JRST REPLAY ;THIS IS ANOTHER WKNTGT
33100 CP2003: CAME TAC2,REGSTR+4 ;ADDRESS OF OTHER END
33200 AOJA TAC5,CP2001
33300 HRLZI TAC2,CAPFRD
33400 ORM TAC2,0(TAC5) ;GIVE CAPFRD CREDIT TO "OTHER END"
33500 HRLZI TAC2,HEURCF
33600 TLNN BWREG,CONTGT+NXTTGT
33700 TRO TAC2,SREVIV ;GIVE REVIVAL CREDIT TO "OTHER END"
33800 ORM TAC2,AUXBTS-AFFMOV(TAC5)
33900 CP2002: SKIPN FORSAV
34000 JRST CAPTU3
34100 CAME SEARCH,AFFSTR+1
34200 JRST CAPTU5 ;NOT TARGET STRING
34300 SOS MSTSAV ;TARGET CAN BE LADDERED
34400 TLNE 16,SURCAP
34500 ADDM TAC5,MSTSAV ;TARGET CAN BE SNAPPED
34600 JRST CAPTU5
34700 CAPTU1: SKIPGE REGSTR+12
34800 TLO 16,SURCAP ;CAPTURE BY "SURE" SNAPBACK
34900 JUMPG ZER,CP2000
35000 SKIPLE REGSTR+12
35100 TLO 16,SNACAP ;CAPTURE BY MOVER BY SNAPBACK
35200 SKIPE FORSAV ;*****THIS IS WINNING LADDER
35300 JRST CAPTU3
35400 SKIPN STRGNM ;HOLDS TEMP1 FROM NEIGH1 IN LADANL
35500 TLO BWREG,CONTGT ;FORCER AFFECTS TARGET COMPLEX BY SAVING
35600 CAMN SEARCH,AFFSTR+1
35700 JRST CAPT22 ;FORCER WINS BY LADDER
35800 CAPTU5: SETZ TAC2,
35900 ADDM TAC4,NOKVEC+5 ;# SAVER STONES CAPTURED
36000 TLNN BWREG,CONTGT+NXTTGT
36100 TRO 16,SREVIV
36200 TLO BWREG,WKNTGT
36300 JRST CAPTU3+3
36400 CAPTU3: MOVEI TAC2,3
36500 TLO BWREG,CONTGT ;THIS MOVE AFFECTS TARGET COMPLEX
36600 ADDM TAC4,NOKVEC+4 ;# FORCER STONES CAPTURED
36700 MOVE TAC4,FSLIBS(TAC2)
36800 LSH TAC4,7
36900 OR TAC4,SEARCH
37000 MOVEM TAC4,FSLIBS(TAC2)
37100 MOVE TAC4,FSLIBS+1(TAC2)
37200 PUSHJ PDP,DELNAM
37300 MOVEM TAC4,FSLIBS+1(TAC2)
37400 JRST NOTLA1
37500
37600 ;**********
37700 ; LOOK AT POTENTIAL AND ACTUAL CAPTURES DISCOVERED BY THE "NOKPR"
37800 ;LOOP TO SEE WHAT THE EXACT STATUS OF THESE CAPTURES IS. THERE ARE
37900 ;SEVERAL POSSIBLE ANSWERS:
38000 ;1. STRING IS DEAD EVEN IF HIS SIDE PLAYS FIRST
38100 ;2. STRING IS DEAD IF HIS OPPONENT PLAYS FIRST
38200 ;3. STRING IS NOT DEAD EVEN IF HIS OPPONENT PLAYS FIRST
38300 ;4. STRING MAY BE DEAD OR ALIVE, THIS LOOP CANT TELL
38400 ; SEE AUXBTS LIST FOR THE BITS SET BY THE LADDER MECHANISM. THESE
38500 ;BITS ARE EXTREMELY USEFUL FOR HEURISTIC ORDERING OF MOVE GOODNESS.
38600 ;**********
38700 ↑LADANL:MOVEI TAC1,3
38800 LDANL1: MOVE ZER,BLKSAV(TAC1) ;USE LADCHK MARK SET UP ABOVE
38900 SOJL ZER,NOTLA1+2
39000 HRLM TAC1,T2SAVE
39100 MOVE SEARCH,@GB1TST(TAC1)
39200 TDNE SEARCH,NFRND
39300 XORI FRIEND,BLKOCC+WHTOCC
39400 ANDI SEARCH,177
39500 JUMPE SEARCH,.+3
39600 CAIE SEARCH,177
39700 CAMN SEARCH,AFFSTR
39800 SAILERR <4> ;THIS SHOULD BE IMPOSSIBLE
39900 ;******** ERROR MESSAGE 4 ********
40000 MOVEM SEARCH,REGSTR+6 ;SAVE STRING NAME FOR USE IN LADCHK
40100 LDB TAC3,[POINT 9,STRPTR(SEARCH),35]
40200 TRZN ZER,10
40300 SOJ TAC3, ;WANT (# LIBS)-1 UNLESS 1-LIB MOVER STRING
40400 PUSHJ PDP,NEIGH1 ;DOES CAP SAVE ANY FRIENDLIES
40500 SKIPE NOLIBS
40600 JRST NOTLA1 ;MOVE DOES NOT CONCERN TARGET COMPLEX
40700 MOVE SEARCH,REGSTR+6
40800 JUMPE ZER,LADLP4
40900 CAIE ZER,2000
41000 JRST LADLP2
41100 ;*****TWO-LIB STRING SAVING (AVOID BEING LADDERED)
41200 MOVEI ZER,1
41300 JRST LADLP4+1
41400 LADLP2: JUMPE TAC3,LADLP3
41500 ;*****ONE-LIB STRING SAVING (AVOID BEING LADDERED)
41600 TDNN FRIEND,NFRND
41700 SKIPA TAC4,NOKVEC+5 ;# CAPTURES BY FORCER
41800 SKIPA TAC4,NOKVEC+4 ;# CAPTURES BY SAVER
41900 SKIPA TAC1,NOKVEC ;# ACTUAL SAVER LIBS
42000 MOVE TAC1,NOKVEC+1 ;# ACTUAL FORCER LIBS
42100 SOJLE TAC1,CAPLOS ;MOVE HAS ONE LIB
42200 SKIPN FORSAV
42300 JRST .+4
42400 TLNN BWREG,CONTGT+NXTTGT
42500 TRO 16,SREVIV
42600 TLOA BWREG,WKNTGT
42700 TLO BWREG,CONTGT
42800 SKIPLE TEMP1
42900 JRST LADL22 ;LADDER WONT WORK
43000 LADL21: SETZ ZER,
43100 HRRZM BWREG,REGSTR+4
43200 HLRZ TAC1,T2SAVE
43300 MOVEM TAC1,REGSTR+5
43400 JRST LADCHK+1
43500 LADL22: SKIPN FORSAV
43600 SKIPA TAC5,[1]
43700 MOVEI TAC5,4
43800 MOVE TAC4,FSLIBS(TAC5)
43900 LSH TAC4,7
44000 OR TAC4,TEMP3 ;NAME OF AFFECTED STRING
44100 MOVEM TAC4,FSLIBS(TAC5)
44200 JRST NOTLA1
44300 ;*****ONE-LIB STRING KILLING (SEE IF LADDER IS NECESSARY)
44400 LADLP3: SKIPE FORSAV
44500 JRST .+5
44600 TLNN BWREG,CONTGT+NXTTGT
44700 TRO 16,SREVIV
44800 TLO BWREG,WKNTGT
44900 SKIPN TEMP1
45000 TLO BWREG,CONTGT
45100 SKIPE TEMP1
45200 JRST LADL21
45300 TLO BWREG,CAPFRD ;THIS CAPTURE SAVES SOMETHING
45400 SKIPE FORSAV
45500 JRST LADL22+1
45600 MOVE SEARCH,TEMP3
45700 LDB SEARCH,[POINT 9,STRPTR(SEARCH),26]
45800 ADDM SEARCH,NOKVEC+4 ;# FORCER STONES SAVED
45900 JRST LADL22+2
46000 ;*****TWO-LIB STRING CHASING (CAN STRING BE CAPTURED)
46100 LADLP4: SETO ZER,
46200 SKIPLE CLEAR,TEMP1
46300 JRST NOTLA1 ;LADDER CANT WORK
46400 MOVEM CLEAR,STRGNM ;SAVE TEMP1 IN CASE LADADD CALLED
46500
46600 ;**********
46700 ; CHECK ATARI OF A STRING TO SEE IF IT IS AN OBVIOUS FORCED
46800 ;CAPTURE. THE POSSIBLE RESULTS ARE EITHER YES (DIRECTLY OR BY LADDER)
46900 ;NO (BECAUSE THE FORCE OR LADDER DOESNT WORK) OR MAYBE (BECAUSE THE
47000 ;PROGRAM IS TOO STUPID TO BE SURE OF THE RESULT).
47100 ;**********
47200 LADCHK: PUSHJ PDP,FINDND ;GET OTHER END OF STRING
47300 MOVE TAC,REGSTR+4 ;GOT BY FINDND
47400 PUSHJ PDP,TACMRK
47500 MOVEI TAC3,3
47600 MOVEI BLANK,BNKOCC
47700 TDNN BLANK,@GB1TST(TAC3)
47800 JRST .+3
47900 MOVEI TAC1,@GODOWN(TAC3)
48000 PUSHJ PDP,TACMR1
48100 SOJGE TAC3,.-4
48200 SKIPN TAC1,REGSTR+5 ;GOT BY FINDND
48300 MOVEI TAC1,4 ;MAKE SURE @GB1TST WORKS
48400 MOVE ENEMY,FRIEND ;FRIEND IS THE SIDE TRYING FOR CAPTURE
48500 XORI ENEMY,BLKOCC+WHTOCC ;ENEMY IS THE SIDE TRYING TO SAVE
48600 MOVE BLANK,@GB1TST+1(TAC1) ;NEXT-TO-ONLY-BLANK POINT
48700 MOVE CLEAR,@GB1TST-1(TAC1) ;NEXT-TO-ONLY-BLANK POINT
48800 SETZM REGSTR+10 ;HOLDS "EXTRA" STONES CAPTURED
48900 SETZM REGSTR+12 ;TELLS METHOD OF CAPTURE
49000 ;*****HANDLE CASE WHERE PROPOSED MOVE IS ONE OF THE NEIGHBORS
49100 SETZM REGSTR+7 ;FLAG FOR SWAPPING
49200 HRRZ TAC3,NOKVEC+1 ;# ACTUAL FORCER LIBS
49300 HRRZ TAC4,NOKVEC ;# ACTUAL SAVER LIBS
49400 TDNE FRIEND,NFRND
49500 EXCH TAC3,TAC4 ;TAC3 HAS CHASING SIDE LIBS
49600 ;*****CHECK EXCEPTION CONDITIONS FOR QUICK DECISION
49700 JUMPLE TAC3,NOTLAD ;CERTAINLY NOT LADDER
49800 JUMPN ZER,SNAP0
49900 SOJLE TAC4,CAPTUR ;STONES CANT ESCAPE
50000 CAIG TAC4,1
50100 JRST TRYFRC ;CANT TELL YET
50200 JRST NOTLAD ;DEFINITELY NOT LADDER
50300 SNAP0: CAILE TAC3,1
50400 JRST NOSNPB
50500 HRRZ TAC5,BWREG
50600 SUB TAC5,TAC
50700 MOVM TAC5,TAC5
50800 CAIE TAC5,BRDWTH
50900 CAIN TAC5,1
51000 JRST SNAP01
51100 CAIG TAC4,4
51200 JRST NOGOOD ;POSSIBLY A SNAPBACK
51300 JRST NOTLAD
51400 SNAP01: JUMPG ZER,.+4
51500 SKIPE FORSAV
51600 JRST .+3
51700 JRST .+3
51800 SKIPN FORSAV
51900 SKIPA TAC4,NOKVEC+1 ;LHS HAS # LIBS ADDED BY CAPTURE
52000 MOVE TAC4,NOKVEC ;LHS HAS # LIBS ADDED BY CAPTURE
52100 HLRZ TAC4,TAC4
52200 SUBM ENEMY,REGSTR+12 ;IF CAPTURE THEN DEFENDING THE POINT
52300 ;WILL NOT PREVENT IT
52400 JRST TRYSNP+1 ;TRY FOR SNAPBACK
52500 ;*****SEE IF ONE OF THE BLANK POINTS IS THE CURRENT PROPOSED MOVE
52600 NOSNPB: HRRZ REPLCE,BWREG ;TAC OF PROPOSED MOVE
52700 CAIN REPLCE,@GODOWN+1(TAC1)
52800 JRST NOSNP1
52900 CAIE REPLCE,@GODOWN-1(TAC1)
53000 JRST TRYFRC
53100 EXCH CLEAR,BLANK
53200 SETOM REGSTR+7 ;FLAG FOR SWAPPING
53300 NOSNP1: MOVEI BLANK,NONOCC
53400 TRNN CLEAR,BNKOCC
53500 JRST TRYSNP ;TRY FOR SNAPBACK
53600 MOVE TAC4,TAC3
53700 JRST TRYFR2 ;THIS COULD BE A LADDER
53800 ;*****SEE IF WE HAVE STARTED A LADDER
53900 TRYFRC: TRNE CLEAR,BNKOCC
54000 JRST TRYFR1
54100 TRNN BLANK,BNKOCC
54200 JRST TRYSNP ;NEITHER POINT IS BLANK
54300 EXCH CLEAR,BLANK
54400 SETOM REGSTR+7 ;FLAG FOR SWAPPING
54500 ;*****DECISION WHEN REGISTER "CLEAR" IS BLANK
54600 TRYFR1: TRNE BLANK,NONOCC
54700 JRST TRYEDG ;TRY FOR EDGE LADDER
54800 TDNN BLANK,FRIEND
54900 JRST TRYSNP
55000 MOVE REPLCE,BLANK
55100 ANDI REPLCE,177
55200 LDB TAC4,[POINT 9,STRPTR(REPLCE),35]
55300 TRYFR2: CAIL TAC4,3
55400 JRST TRYLAD ;TRY FOR LADDER
55500 ;**********
55600 ; ACCUMULATE THE NUMBER OF LIBERTIES THE SAVING SIDE WILL ACQUIRE BY
55700 ;PLAYING ON THE ONE MOVE OPEN TO HIM. IF THIS NUMBER IS <2, THEN WE HAVE A
55800 ;CAPTURE BY SNAPBACK. IF THE NUMBER IS >2, THEN THERE IS NO FORCED CAPTURE
55900 ;POSSIBLE. IF THE NUMBER IS EXACTLY TWO, THEN THERE MAY OR MAY NOT BE
56000 ;ANY CAPTURE POSSIBLE. FURTHERMORE, THE CAPTURE BY SNAPBACK IS DIFFERENT
56100 ;FROM THE CAPTURE BY LADDER...IT SETS REGSTR+12 FOR INTERPRETATION DURING
56200 ;THE CAPTUR. IT CAN ALSO SET STHRET.
56300 ;**********
56400 TRYSNP: SETZ TAC4,
56500 SETZM ENMCNT-1 ;HOLDS # ATARIED FRIENDLY STONES
56600 TRNE CLEAR,BNKOCC
56700 AOJA TAC4,TRYSN1
56800 TRNE CLEAR,NONOCC
56900 JRST TRYSN1
57000 MOVE REPLCE,CLEAR
57100 PUSHJ PDP,ENMCNT
57200 ANDI CLEAR,177
57300 TRYSN1: TRNE BLANK,BNKOCC
57400 AOJA TAC4,TRYSN2
57500 TRNE BLANK,NONOCC
57600 JRST TRYSN2
57700 MOVE REPLCE,BLANK
57800 PUSHJ PDP,ENMCNT
57900 ANDI BLANK,177
58000 TRYSN2: MOVE REPLCE,@GB1TST+2(TAC1)
58100 TRNE REPLCE,BNKOCC
58200 AOJA TAC4,SNPEND
58300 TRNN REPLCE,NONOCC
58400 JRST TRYSN3
58500 TDNN ENEMY,@GB1TST+1(TAC1)
58600 TDNE ENEMY,@GB1TST-1(TAC1)
58700 JRST SNPEND ;ENEMY STONE ON EDGE
58800 MOVE REPLCE,@G1IKKN+1(TAC1)
58900 TDNN ENEMY,REPLCE
59000 JRST .+4
59100 ANDI REPLCE,177
59200 LDB TAC3,[POINT 9,STRPTR(REPLCE),35]
59300 SOJG TAC3,SNPEND
59400 MOVE REPLCE,@G1IKKN-1(TAC1)
59500 TDNN ENEMY,REPLCE
59600 SOJA TAC4,SNPEND
59700 ANDI REPLCE,177
59800 LDB TAC3,[POINT 9,STRPTR(REPLCE),35]
59900 SOJG TAC3,SNPEND
60000 SOJA TAC4,SNPEND
60100 TRYSN3: PUSHJ PDP,ENMCNT
60200 ;*****CHECK FOR DIAGONAL DUPLICATE LIBERTIES
60300 TDNN ENEMY,@GB1TST+2(TAC1)
60400 JRST SNPEND
60500 TDNN ENEMY,@GB1TST+1(TAC1)
60600 JRST DIACH1
60700 MOVE TAC3,@G1DIAG+2(TAC1)
60800 TRNE TAC3,BNKOCC
60900 SOJ TAC4, ;DUPLICATE DIAG LIBERTY
61000 DIACH1: TDNN ENEMY,@GB1TST+3(TAC1)
61100 JRST SNPEND
61200 MOVE TAC3,@G1DIAG+3(TAC1)
61300 TRNE TAC3,BNKOCC
61400 SOJ TAC4, ;DUPLICATE DIAG LIBERTY
61500 ;**********
61600 ; FROM THE NUMBER OF LIBERTIES (IN TAC4), DECIDE WHETHER THE STRING CAN
61700 ;BE CAPTURED, IS NOT CAPTURABLE, OR MAY BE CAPTURABLE.
61800 ;**********
61900 SNPEND: JUMPGE ZER,SNPEN1
62000 SKIPN REGSTR+10
62100 JRST SNPEN1
62200 SKIPE FORSAV
62300 TRO 16,STHRET ;THREATENS TO CAPTURE TWO STRINGS
62400 SNPEN1: SOJG TAC4,SNPEN2
62500 AOS REGSTR+12 ;CAPTURE BY SNAPBACK
62600 CAIE TAC4,0
62700 SUBM ENEMY,REGSTR+12 ;DEFENDING POINT WONT SAVE STONES
62800 JRST CAPTUR
62900 SNPEN2: SOJG TAC4,NOTLAD
63000 SOSLE ENMCNT-1
63100 JRST NOTLAD ;TWO LIBS AND THREATENS ≥2 STONES
63200 ;*****TURN ON THE MAYLAD BIT IF LADDER CHECK CANT DECIDE
63300 NOGOOD: JUMPE ZER,NOTLA1
63400 MOVE SEARCH,REGSTR+6
63500 CAME SEARCH,AFFSTR+1
63600 JRST .+3
63700 TRO 16,FTHRET ;TARGET MAY BE LADDERED
63800 SETOM NOTWIN ;DISABLE SOME WINNING CHECKS
63900 JUMPG ZER,NOGOO1
64000 SKIPE FORSAV
64100 TLO BWREG,CONTGT ;LET SAVER TRY ALMOST-CAPTURE
64200 TROA 16,MAYLAD ;SNAP MAY WORK FOR MOVER
64300 NOGOO1: TRO 16,MAYLAE ;SNAP MAY WORK FOR NONMOVER
64400 JRST NOTLA1
64500 ;*****TURN ON THE NLADDR BIT IF THERE IS NO LADDER
64600 NOTLAD: JUMPE ZER,NOTLA1
64700 CAIL ZER,0
64800 TROA 16,NLADDE ;NOT LADDER FOR NON-MOVER
64900 TRO 16,NLADDR ;NOT LADDER FOR MOVER
65000
65100 NOTLA1: HRRZ TAC,BWREG
65200 HLRZ TAC1,T2SAVE
65300 MOVE FRIEND,NFRND
65400 SOJGE TAC1,LDANL1
65500 HRRZ TAC2,T2SAVE
65600 POPJ PDP,
65700
65800 BEND
00100 ;*****GET FRIENDLY STRNGS CONNECTED TO TARGET
00200 ;*****GET WEAK CHASING STRINGS NEXT TO TARGET
00300 ;*****NOTE SEARCH AND LIBSNO ARE ALREADY SET EXTERNALLY
00400 PLAYFS: MOVE TAC,STRPTR
00500 MOVEM TAC,AFFSTR ;MAKE SURE WE DONT "FIND" THE UNUSED STRING
00600 MOVEM SEARCH,AFFSTR+1 ;STRING IS ITS OWN NEIGHBOR
00700 SETZM AFFSTR+2 ;HOLDS STRING NAMES OF NEIGHBORS
00800 LDB TAC4,[POINT 9,STRPTR(SEARCH),17]
00900 MOVE TAC1,GB1(TAC4)
01000 ANDI TAC1,WHTOCC+BLKOCC
01100 MOVEM TAC1,NFRND ;TELLS WHICH SIDE IS TARGET
01200 ;*****SEE IF KOTAC MEANS ILLEGAL MOVE FOR CURRENT MOVER
01300 SETZ TAC3,
01400 SKIPN TAC,KOTAC
01500 JRST KOFIX1 ;NO KO POINT
01600 SUB TAC4,TAC
01700 MOVM TAC4,TAC4
01800 CAIE TAC4,BRDWTH
01900 SOJN TAC4,.+4
02000 HRRZ TAC4,STRPTR(SEARCH)
02100 TRNN TAC4,776776
02200 SETZM SVCRIT ;1-LIB TARGET IS A KO
02300 MOVEI TAC2,3
02400 KOFIX3: TDNN TAC1,@GB1TST(TAC2)
02500 JRST KOFIX2
02600 SKIPE FORSAV
02700 EXCH TAC,TAC3 ;SAVER CAN FILL AT KO POINT
02800 JRST KOFIX1
02900 KOFIX2: SOJGE TAC2,KOFIX3
03000 SKIPN FORSAV
03100 EXCH TAC,TAC3 ;FORCER CAN FILL AT KO POINT
03200 KOFIX1: MOVEM TAC,KOSAVE ;SET MOVER ILLEGAL KO RETAKE VALUE
03300 MOVEM TAC3,KOSAV1 ;SET NON-MOVER ILLEGAL KO RETAKE VALUE
03400 SETZM AFFMOV ;HOLDS POSSIBLE MOVE LOCATIONS
03500 MOVEI TAC1,MAXSTR ;CONSIDER UP TO MAXSTR STRINGS
03600 MOVEM TAC1,BNDCNS ;SET MAX # STRINGS CUTOFF
03700 MOVEI FRIEND,BCON+WCON ;SET FRIEND FOR GROUP POINTS
03800 PUSHJ PDP,NEIGHS ;"SEARCH" IS SET EXTERNALLY
03900 SKIPG BNDCNS
04000 JRST SEXCSS ;TOO MANY STRINGS
04100 ;*****IF MORE THAN ONE CONNECTION POINT, GET ALL FRIENDLIES
04200 MOVE TAC1,NOCONS
04300 SOJG TAC1,.+5
04400 MOVEI TAC1,AFFSTR+2
04500 SKIPE 0(TAC1)
04600 AOJA TAC1,.-1
04700 JRST CONRC1-1
04800 ;*****GET FRIENDLY STRINGS NEXT TO CONTGT STRINGS
04900 SETOM LIBSNO ;ONLY COUNT CONNECTED FRIENDLIES
05000 MOVEI TAC1,AFFSTR+2
05100 HRRM TAC1,CONREC
05200 CONREC: HRRZ SEARCH,0 ;NO REG AVAILABLE
05300 JUMPE SEARCH,CONRC1
05400 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
05500 MOVE TAC1,GB1(TAC)
05600 TDNE TAC1,NFRND
05700 PUSHJ PDP,NEIGHS
05800 SKIPG BNDCNS
05900 JRST SEXCSS ;TOO MANY STRINGS
06000 AOS CONREC
06100 JRST CONREC
06200 ;*****LOOK AT THE WEAK CHASING STRINGS AND MAKE SURE THEY ARE NOT CONNECTED
06300 ;*****TO STRONG STRNGS. IF THEY ARE, THERE IS NOT POINT IN LOOKING
06400 ;*****AT THEM UNLESS THEY CAN BE CAPTURED OR ATARIED.
06500 HRRM TAC1,CONREC ;SET CONREC FOR FUTURE USE
06600 CONRC1: MOVE TAC3,NFRND
06700 SETZ TAC1,
06800 MOVEI TAC2,1
06900 WK1LOP: HRRZ SEARCH,AFFSTR(TAC2)
07000 JUMPE SEARCH,WK1LP1
07100 MOVEM SEARCH,BLKSAV(TAC2) ;SAVE AFFECTED STRINGS LIST
07200 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
07300 TDNE TAC3,GB1(TAC)
07400 AOJA TAC2,WK1LOP ;TARGET-SIDE STRING
07500 CAIL TAC1,=9
07600 JRST SEXCSS
07700 MOVEM SEARCH,WEAKNT(TAC1)
07800 AOJA TAC1,.-4
07900 WK1LP1: SETZM BLKSAV(TAC2) ;END MARKER
08000 SETOM STRONG ;HOLDS END INDEX OF "STRONG" WKNTGTS
08100 SETZM WEAKNT(TAC1) ;END MARKER
08200 JUMPE TAC1,NOWEAK
08300 MOVE TAC1,BNDCNS
08400 MOVEM TAC1,TEMP1
08500 MOVEI TAC1,1
08600 MOVEM TAC1,LIBSNO ;SET TO PICK UP ATARIED TARGET-SIDES
08700 SETZ TAC1,
08800 WKLOOP: SKIPN SEARCH,WEAKNT(TAC1)
08900 JRST WKLOPF
09000 MOVEM SEARCH,AFFSTR+2
09100 SETZM AFFSTR+3
09200 MOVEI TAC2,MAXSTR
09300 MOVEM TAC2,BNDCNS
09400 PUSH PDP,TAC1
09500 PUSHJ PDP,NEIGHS
09600 POP PDP,TAC1
09700 ;*****SEE IF WKNTGT IS REALLY WEAK
09800 HRRZ SEARCH,AFFSTR+2
09900 LDB TAC3,[POINT 9,STRPTR(SEARCH),35]
10000 SUBI TAC3,2 ;ALLOW FOR OVERLAPPING LIBS
10100 MOVE TAC4,NFRND
10200 MOVEI TAC2,AFFSTR+3
10300 WKLOP1: HRRZ SEARCH,0(TAC2)
10400 JUMPE SEARCH,WKLOP2
10500 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
10600 TDNE TAC4,GB1(TAC)
10700 AOJA TAC3,WKLOP2-1 ;ATARIED NEIGH COUNTS AS A LIB
10800 LDB TAC5,[POINT 9,STRPTR(SEARCH),35]
10900 SUBI TAC5,2 ;ALLOW FOR OVERLAPPING LIBS
11000 ADD TAC3,TAC5
11100 AOJA TAC2,WKLOP1
11200 WKLOP2: CAMG TAC3,TGLIBS
11300 AOJA TAC1,WKLOOP
11400 HRRZ SEARCH,AFFSTR+2
11500 AOS TAC2,STRONG ;INCREMENT # STRONG CHASERS
11600 MOVEM SEARCH,WEAKNT(TAC2)
11700 AOS TEMP1 ;NOTE ONE FEWER STRING TO LOOK AT
11800 AOJA TAC1,WKLOOP
11900 WKLOPF: MOVE TAC1,TEMP1
12000 MOVEM TAC1,BNDCNS
12100 MOVE TAC1,[XWD -MAXSTR,1]
12200 SKIPN TAC2,BLKSAV(TAC1)
12300 JRST NOWEAK-1
12400 MOVEM TAC2,AFFSTR(TAC1)
12500 AOBJN TAC1,.-3
12600 SETZM AFFSTR(TAC1)
12700 ;*****SET CUTOFFS AND TESTS IN TERMS OF HOW MANY MOVES WILL BE CONSIDERED
12800 ;*****BEFORE THE PROGRAM GIVES UP CHASING A STRING
12900 NOWEAK: MOVE TAC1,BNDCNS
13000 SUBI TAC1,MAXSTR-MXSTRG
13100 SKIPG TAC1
13200 JRST SEXCSS ;TOO MANY STRINGS
13300 MOVEM TAC1,BNDCNS
13400 MOVE FRIEND,NDXFOR
13500 CAIL FRIEND,PH1CUT ;CUTOFF AT 19 LEVELS
13600 SKIPA FRIEND,[MXMVES-PHASE2] ;ALLOW 4 MOVES AFTER CUT
13700 MOVEI FRIEND,MXMVES-PHASE1 ;ALLOW 6 MOVES BEFORE CUT
13800 MOVEM FRIEND,LOWBND
13900 MOVEI FRIEND,MXMVES
14000 MOVEM FRIEND,BNDCNL ;SET MAX # MOVES CUTOFF
14100 ;*****GET LIBERTIES OF THE OBVIOUS STRINGS
14200 MOVEI FRIEND,AFFSTR+1 ;IGNORE REPLCE AT AFFSTR+0
14300 HRRM FRIEND,PLAYF1
14400 PLAYF1: HRRZ SEARCH,0 ;NO REGISTER AVAILABLE FOR THIS LOOP
14500 JUMPE SEARCH,PLAYF0
14600 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
14700 MOVE TAC1,GB1(TAC)
14800 TDNE TAC1,NFRND
14900 JRST ISFRND
15000 LDB TAC2,[POINT 9,STRPTR(SEARCH),35]
15100 CAIG TAC2,2
15200 JRST ISCHAS ;ALWAYS CONSIDER 1-LIB & 2-LIB
15300 SKIPGE TAC2,STRONG
15400 JRST ISCHAS
15500 CAMN SEARCH,WEAKNT(TAC2)
15600 JRST PLAYF3+3 ;THIS IS "STRONG" WKNTGT
15700 SOJGE TAC2,.-2
15800 ISCHAS: HRLZI FRIEND,WKNTGT
15900 JRST PLAYF3
16000 ISFRND: HRLZI FRIEND,CONTGT
16100 CAMN SEARCH,AFFSTR+1
16200 TLC FRIEND,NXTTGT+CONTGT
16300 PLAYF3: PUSHJ PDP,LBSGET+1 ;GET POINTS NEXT TO NEIGHBORS
16400 SKIPG BNDCNL
16500 JRST LEXCSS ;TOO MANY LIBERTIES
16600 AOS PLAYF1
16700 JRST PLAYF1
16800 PLAYF0: MOVEI TAC1,AFFMOV
16900 SKIPE 0(TAC1)
17000 AOJA TAC1,.-1
17100 MOVEM TAC1,AUGSRT ;THIS IS FIRST AVAILABLE AUGMENT SLOT
17200 ;*****GET WEAK FRIENDLIES BEYOND WEAK CHASERS AND
17300 ;*****GET WEAK CHASERS NEXT TO NON-TARGET FRIENDLIES
17400 PLAYFF: MOVEI TAC,AFFSTR+2
17500 HRRM TAC,ENMYCP
17600 ENMYCP: HRRZ SEARCH,0 ;NO REGISTER AVAILABLE
17700 JUMPE SEARCH,ENMYC2+2
17800 SETZ FRIEND, ;ONLY WANT ONE STRING AT A TIME
17900 MOVE TAC3,CONREC
18000 CAMG TAC3,ENMYCP ;COMPARING INSTRUCTIONS IS UGLY
18100 JRST ENMYC3-1 ;DONT WANT FAKE WKNTGT'S
18200 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
18300 LDB TAC2,[POINT 9,STRPTR(SEARCH),35]
18400 MOVE TAC1,GB1(TAC)
18500 TDNN TAC1,NFRND
18600 JRST ENMYC4
18700 SKIPE FORSAV
18800 JRST ENMYC3
18900 JRST ENMYC3-2
19000 ENMYC4: CAMLE TAC2,TGLIBS
19100 JRST ENMYC2 ;CANT THREATEN THIS STRING
19200 SKIPGE TAC3,STRONG
19300 JRST .+4
19400 CAMN SEARCH,WEAKNT(TAC3)
19500 JRST ENMYC2 ;THIS IS "STRONG" WKNTGT
19600 SOJGE TAC3,.-2
19700 MOVEI FRIEND,BCON+WCON ;WKNTGT NEIGHBORS ARE ALLOWED
19800 SKIPN FORSAV
19900 JRST ENMYC3
20000 SOJG TAC2,ENMYC3
20100 MOVEI TAC2,1 ;DONT LET LIBSNO BE 0
20200 ENMYC3: MOVEM TAC2,LIBSNO
20300 PUSHJ PDP,NEIGHS
20400 SKIPG BNDCNS
20500 JRST SEXCSS ;TOO MANY STRINGS
20600 ENMYC2: AOS ENMYCP
20700 JRST ENMYCP
20800 ;*****GET LIBERTIES OF THE NOT-SO-OBVIOUS STRINGS
20900 SETZM AUGFLG ;ALLOW ALL AUGMENT MOVES
21000 MOVE SEARCH,BNDCNL
21100 MOVEM SEARCH,TEMP3 ;SAVE OLD BNDCNL IF AUGMENT FAILS
21200 HRRZ FRIEND,PLAYF1
21300 HRRM FRIEND,AUGFS1
21400 AUGFS1: SKIPN SEARCH,0 ;NO REGISTER AVAILABLE
21500 JRST PLAYF2
21600 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
21700 MOVE TAC1,GB1(TAC)
21800 TDNE TAC1,NFRND
21900 JRST AUGFS3
22000 LDB TAC2,[POINT 9,STRPTR(SEARCH),35]
22100 SKIPE FORSAV
22200 SOJ TAC2,
22300 CAMLE TAC2,TGLIBS
22400 JRST AUGFS4 ;ENEMY STRING IS TOO BIG
22500 JRST .+2
22600 AUGFS3: SKIPN AUGFLG ;≠0 MEANS ALLOW ONLY WKNTGT MOVES
22700 PUSHJ PDP,LBSGET
22800 SKIPG BNDCNL
22900 JRST AUGFS2 ;TOO MANY LIBERTIES
23000 AUGFS4: AOS AUGFS1
23100 JRST AUGFS1
23200 AUGFS2: MOVE TAC1,TEMP3
23300 MOVEM TAC1,BNDCNL ;RESTORE OLD BNDCNL
23400 MOVE TAC1,AUGSRT
23500 SETZM 0(TAC1) ;RESTORE OLD AFFMOV LIST
23600 SKIPL AUGFLG
23700 JRST .+4
23800 SKIPE FORSAV
23900 JRST LEXCSS ;SAVER WINS BY "TOO MANY MOVES"
24000 JRST PLAYF2 ;FORCER CONTINUES WITHOUT AUGMENTS
24100 SETOM AUGFLG
24200 JRST AUGFS1-2 ;TRY AGAIN WITHOUT AUGMENTING FRIENDLIES
00100 ;**********
00200 ; THIS IS START OF AN EXTRACTION OF PROPERTIES FOR EACH PROPOSED MOVE.
00300 ;THE PROPERTIES ARE REPRESENTED AS BITS IN THE LEFT HALF OF REGISTER BWREG
00400 ;AND IN WTARM (PROPOSED MOVES LIST). BESIDES ASSIGNING PROPERTIES, THE
00500 ;LOOP IS CAPABLE OF DELETING USELESS OR ILLEGAL MOVES FROM FURTHER
00600 ;CONSIDERATION.
00700 ;**********
00800 PLAYF2: SETO TAC2,
00900 SETZM TCMPLX
01000 SKIPN TAC1,AFFMOV+1(TAC2)
01100 JRST .+4
01200 TLNE TAC1,NXTTGT+CONTGT
01300 AOS TCMPLX ;COUNT # BLANKS IN TARGET COMPLEX
01400 AOJA TAC2,.-4
01500 MOVEI TAC2,MAXSTR
01600 SETZM LBSSTR(TAC2) ;ZERO OUT LIBERTY SCORES
01700 SETZM AUXBTS(TAC2) ;ZERO OUT AUXILIARY BITS
01800 SOJGE TAC2,.-2
01900 MOVEI TAC2,AFFMOV
02000 SETZM XTDFRC ;FORCER FORCED MOVE ADDRESS
02100 SETZM MUSTSV ;≠0 MEANS MUST SAVE STONES
02200 SETZM MSTSAV ;≠0 MEANS A LADDER MUST BE AVOIDED
02300 MOVE TAC1,NDXFOR
02400 SETZM NOTWIN
02500 CAIG TAC1,5
02600 SETOM NOTWIN ;DONT ALLOW CERTAIN WINNERS AT START
02700 SETZM XTDFR1 ;SECOND FORCED MOVE ADDRESS
02800 SETZM SAVWIN ;COUNTS NUMBER OF SAVER WINNERS FOUND BY FORCER
02900 SETZM SAVWN1 ;FORCED SAVE OF FRIENDLY
03000 SETZM CONFLG ;NONZERO IF THERE IS A CONTGT WINNER
03100 SETOM EYECNT ;COUNTER FOR # EYES
03200 PRPLOP: MOVE 16,AUXBTS-AFFMOV(TAC2)
03300 SKIPN BWREG,0(TAC2)
03400 JRST BUBLP2
03500 JUMPL BWREG,ILLPR1 ;THIS POINT HAS ALREADY BEEN DONE
03600 HRRZ TAC,BWREG
03700 ;*****ILLEGAL AND UNACCEPTABLE MOVE CHECKING
03800 CAME TAC,KOSAVE ;THIS MOVE IS ILLEGAL KO RETAKE FOR MOVER
03900 JRST ILLPR1+1
04000 TLO 16,SILLPT
04100 TLZ BWREG,777777-(NXTTGT+CONTGT+WKNTGT) ;"REALLY" BAD MOVE
04200 ILLPRP: TLON BWREG,400000 ;MAKE BWREG NEGATIVE
04300 AOS BNDCNL ;THIS FREES ANOTHER MOVE SLOT
04400 MOVEM BWREG,0(TAC2) ;MARK MOVE UNACCEPTABLE
04500 MOVEM 16,AUXBTS-AFFMOV(TAC2)
04600 ILLPR1: AOJA TAC2,PRPLOP
04700 MOVEM TAC2,T2SAVE
04800 ;*****GET LIBERTY ESTIMATE FOR CURRENT PROPOSED MOVE
04900 MOVE FRIEND,NFRND
05000 PUSHJ PDP,LIBEST
05100 MOVEI TAC1,10
05200 MOVE TAC2,LIBVEC(TAC1)
05300 MOVEM TAC2,NOKVEC(TAC1) ;SAVE LIBEST INFO
05400 SOJGE TAC1,.-2
05500 OR 16,LIBVEC+11 ;SET CURRENT MOVE KO STATUS
05600 ;**********
05700 ; SET UP A RECORD OF STRINGS 2-LIBBED, ATARIED, OR CAPTURED BY EACH
05800 ;SIDE. SET UP INPUT TO LADANL SO LADDER POSSIBILITIES CAN BE CHECKED
05900 ;WHERE NECESSARY FOR EACH SIDE.
06000 ;**********
06100 MOVEI TAC1,5
06200 SETZM FSLIBS(TAC1)
06300 SETZM BLKSAV(TAC1)
06400 SOJGE TAC1,.-2
06500 SETZM NOKVEC+11 ;# "NEW" SAVER LIBS
06600 SETZM NWSTRG ;ARRAY HOLDS NEW SAVER STRINGS
06700 SETZ TAC2,
06800 MOVEI TAC5,3
06900 NOKPR2: MOVE SEARCH,NGHSTR(TAC2)
07000 MOVEM SEARCH,GRUPNO(TAC2) ;SAVE NEIGHBOR STRING NAME
07100 JUMPE SEARCH,NOKPR1
07200 NOKP21: LDB TAC3,[POINT 7,@GB1TST(TAC5),35]
07300 JUMPE TAC3,.+3
07400 CAMN TAC3,SEARCH
07500 JRST NOKP22
07600 SOJGE TAC5,NOKP21
07700 SAILERR <5> ;******** ERROR MESSAGE 5 ********
07800 NOKP22: LDB TAC3,[POINT 9,STRPTR(SEARCH),35] ;# LIBS
07900 LDB TAC1,[POINT 9,STRPTR(SEARCH),17]
08000 TDNN FRIEND,GB1(TAC1)
08100 JRST NOKPR4
08200 CAILE TAC3,3
08300 JRST .+5
08400 MOVE TAC4,FSLIBS-1(TAC3)
08500 LSH TAC4,7
08600 OR TAC4,SEARCH
08700 MOVEM TAC4,FSLIBS-1(TAC3)
08800 SOJN TAC3,NOKPR3
08900 MOVEI TAC3,1001 ;ONE-LIB TARGET-SIDE STRING
09000 SKIPE FORSAV
09100 JRST NOKPR9
09200 CAME SEARCH,AFFSTR+1
09300 JRST NOKP66+1
09400 MOVEI TAC5,4
09500 JRST STOPIT ;JUST CAPTURED TARGET STRING
09600 ;*****SEE IF THIS IS A NON-TARGET-COMPLEX STRING
09700 NOKPR3: PUSHJ PDP,NEWSTR
09800 JUMPE TAC4,.+2
09900 ADDM TAC3,NOKVEC+11 ;NEW LIBS FROM NEW STRING
10000 CAIN TAC3,2
10100 TLOA 16,STWOLB ;SAVER STONES TWOLIBBED
10200 CAIE TAC3,1
10300 AOJA TAC2,NOKPR2
10400 SKIPN FORSAV
10500 JRST NOKP66
10600 ;*****SEE IF THREAT WILL BE A CAPTURE INSTEAD
10700 NOKP99: MOVEI TAC3,2001 ;MARK FOR 2-LIB AVOIDING LADDER
10800 JRST NOKP66+1
10900 NOKPR4: CAILE TAC3,3
11000 JRST .+5
11100 MOVE TAC4,FSLIBS+2(TAC3)
11200 LSH TAC4,7
11300 OR TAC4,SEARCH
11400 MOVEM TAC4,FSLIBS+2(TAC3)
11500 SOJN TAC3,NOKPR5
11600 MOVEI TAC3,1001 ;ONE LIB CHASER-SIDE STRING
11700 SKIPN FORSAV
11800 NOKPR9: TRO TAC3,10 ;MARK ONE-LIB STRING "ON MOVER SIDE"
11900 JRST NOKP66+1
12000 NOKPR5: CAIN TAC3,2
12100 TLOA 16,FTWOLB ;MOVE HERE TWOLIBS FORCER STRING
12200 CAIE TAC3,1
12300 NOKPR6: AOJA TAC2,NOKPR2
12400 SKIPN FORSAV
12500 JRST NOKP99 ;FORCER MOVING, FORCER 1-LIB STRING
12600 NOKP66: MOVEI TAC3,1 ;MARK FOR CREATING 2-LIB LADDER
12700 MOVEM TAC3,BLKSAV(TAC5)
12800 SOJA TAC5,NOKPR6
12900 ;**********
13000 ; LOOK AT BLANKS NEXT TO PROPOSED MOVE TO SEE IF SAVER MOVE WILL
13100 ;MAKE THEM FORCER SELF-ATARI OR IF THERE IS POSSIBLE HELP FOR SAVER
13200 ;FROM NON-TARGET-COMPLEX SAVER STRINGS BEYOND THE BLANK. ALSO SEE IF
13300 ;THIS BLANK IS "NEW" TO THE TARGET COMPLEX.
13400 ;**********
13500 NOKPR1: SETOM TWOATR ;COUNTS SAVER-CREATED FORCER SELF-ATES
13600 SETZM MORLBS ;LIBS FROM CONNECT TO NEW STRING
13700 SETZM MORLBF ;LIBS FROM FORCER CONNECTION
13800 HRRZ TAC1,NOKVEC
13900 CAIGE TAC1,2
14000 JRST BNKPR1+1 ;CURRENT MOVE HAS <2 SAVER LIBS
14100 MOVEI CLEAR,177 ;USED TO TEST FOR BLANKS
14200 MOVEI TAC1,3
14300 BNKPR2: TDNE CLEAR,@GB1TST(TAC1)
14400 JRST BNKPR1 ;NOT A BLANK
14500 MOVEM TAC1,REGSTR+1
14600 MOVEI TAC,@GODOWN(TAC1)
14700 PUSHJ PDP,LIBEST
14800 HRRZ TAC2,LIBVEC+1
14900 CAILE TAC2,3
15000 JRST BNKPR5 ;FORCER WILL HAVE >2 LIBS
15100 SUBI TAC2,2
15200 JUMPLE TAC2,.+4
15300 SKIPE LIBVEC+3
15400 JRST BNKPR5 ;FORCER STRING SUPPORTS CUT
15500 JRST BNKPR3-1
15600 AOSLE TWOATR ;FORCER SELF-ATE POINT CREATED
15700 TLO BWREG,TWOATE ;≥2 FORCER SELF-ATE POINTS
15800 MOVEI TAC1,NGHSTR
15900 BNKPR3: SKIPN SEARCH,0(TAC1)
16000 JRST BNKPR5
16100 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
16200 TDNN FRIEND,GB1(TAC)
16300 AOJA TAC1,BNKPR3 ;FORCER NEIGHBOR STRING
16400 LDB TAC3,[POINT 9,STRPTR(SEARCH),35]
16500 CAIGE TAC3,2
16600 AOJA TAC1,BNKPR3 ;ATARIED SAVER NEIGHBOR
16700 MOVEI TAC4,GRUPNO
16800 SKIPN TAC5,0(TAC4)
16900 JRST BNKPR4
17000 CAME TAC5,SEARCH
17100 AOJA TAC4,.-3
17200 AOJA TAC1,BNKPR3 ;NEIGHBOR OF PROPOSED MOVE ALSO
17300 BNKPR4: PUSHJ PDP,NEWSTR
17400 JUMPE TAC4,.+4 ;NOT NEW STRING TO TARGET
17500 JUMPLE TAC2,.+3
17600 SUBI TAC3,2
17700 ADDM TAC3,MORLBS ;ADDED LIBS FROM SAVER CONNECTION
17800 AOJA TAC1,BNKPR3
17900 ;*****SEE IF BLANK NEW TO TARGET COMPLEX
18000 BNKPR5: MOVE TAC1,REGSTR+1
18100 HRRZ TAC,BWREG
18200 MOVEI TAC5,@GODOWN(TAC1)
18300 SETZ TAC3,
18400 SKIPN SEARCH,AFFMOV(TAC3)
18500 JRST BNKP11 ;CANT FIND LIBERTY ON MOVES LIST
18600 CAIE TAC5,0(SEARCH)
18700 AOJA TAC3,.-3
18800 TLNE SEARCH,NXTTGT
18900 JRST BNKPR1
19000 TLNN SEARCH,CONTGT
19100 JRST BNKP11 ;THIS LIB IS NEW TO TARGET COMPLEX
19200 MOVE TAC3,AUXBTS(TAC3)
19300 TLNN TAC3,NEWCGT
19400 JRST BNKPR1
19500 BNKP11: AOS NOKVEC+11 ;NEW LIBERTY FOR TARGET COMPLEX
19600 MOVEI TAC,@GODOWN(TAC1)
19700 PUSHJ PDP,TACMRK
19800 MOVEI TAC,@GODOWN+2(TAC1)
19900 BNKPR1: SOJGE TAC1,BNKPR2
20000 HRRZ TAC2,T2SAVE
20100 ;*****LADDER ANALYSIS TO CHECK FORCED CAPTURES
20200 PUSHJ PDP,LADANL
20300 TLNE BWREG,NXTTGT
20400 JRST TGCHEK
20500 SKIPN FORSAV
20600 JRST TGCHK1
20700 SKIPN MSTSAV
20800 SKIPE SVCRIT
20900 JRST TGCHEK
21000 TGCHK1: MOVE TAC1,TCMPLX ;TARGET COMPLEX STRENGTH
21100 SUB TAC1,FORSAV ;ADJUST ONE LIB FOR MOVER
21200 CAMG TAC1,CUTLBX
21300 JRST TGCHEK
21400 MOVNI TAC5,=15 ;TARGET COMPLEX IS TOO STRONG
21500 JRST SEXCSS+1
21600 ;**********
21700 ; SET BITS IN LEFT HALF OF BWREG TO DENOTE CAPTURES OR SAVES
21800 ;OR THREATS FOR EITHER SIDE. THESE FORCING QUANTITIES ARE USEFUL IN
21900 ;DECIDING BETWEEN MOVES FOR FORWARD PRUNING.
22000 ;**********
22100 TGCHEK: MOVEI TAC1,FSLIBS
22200 MOVEI TAC3,FSLIBS+3
22300 SKIPE FORSAV
22400 EXCH TAC1,TAC3 ;TAC1 POINTS TO SIDE NOT MOVING
22500 SKIPN TAC4,0(TAC1)
22600 JRST NDCAPS ;NO CAPTURES FOR MOVER
22700 TLO BWREG,CAPENM
22800 SKIPE FORSAV
22900 AOSG TWOATR
23000 TRNE TAC4,37600
23100 TLO BWREG,TWOATE
23200 NDCAPS: SKIPN TAC4,0(TAC3)
23300 JRST NDCAP1 ;NO CAPTURES FOR NON-MOVER
23400 TLO BWREG,CAPFRD
23500 SKIPN FORSAV
23600 AOSG TWOATR
23700 TRNE TAC4,37600
23800 TLO BWREG,TWOATE
23900 NDCAP1: SKIPE 1(TAC1)
24000 TLO BWREG,THRTGS
24100 SKIPE 1(TAC3)
24200 TLO BWREG,SAVTGS
24300 SKIPN FSLIBS+2
24400 SKIPE FSLIBS+5
24500 TLO BWREG,TWOLIB
24600 ;*****SAVER 1-LIB TARGET REQUIRES INSTANT SAVING MOVES
24700 SKIPN SVCRIT
24800 JRST SVCRI1
24900 TLNN BWREG,NXTTGT
25000 JRST SVCRI1-3
25100 MOVE TAC1,NOKVEC+3 ;# FORCER LIBS FROM STRINGS
25200 ADD TAC1,NOKVEC+10 ;# BLANKS
25300 SUB TAC1,NOKVEC+7 ;# FORCER DUPLICATE LIBS
25400 SOJLE TAC1,.+2
25500 TRO 16,SEMPT ;IF ANOTHER MOVE SAVES, THIS WILL BE FSATE
25600 JRST SVCRI1
25700 TLNE BWREG,CONTGT
25800 TLNN BWREG,CAPFRD
25900 JRST ILLPRP-1 ;MOVE DIDNT ACT TO SAVE TARGET
26000 ;**********
26100 ; NOW USE THE PROPERTIES JUST CALCULATED TO DETERMINE ILLEGAL AND
26200 ;UNACCEPTABLE MOVES. CHECK FOR SEVERAL SORTS OF EXCEPTIONAL CONDITIONS.
26300 ;TRY TO EXPAND THE NUMBER OF MOVES UNDER CONSIDERATION (OR EVEN THE NUMBER
26400 ;OF STRINGS CONSIDERED AFFECTED).
26500 ;**********
26600 SVCRI1: MOVE SEARCH,NOKVEC+10 ;# BLANKS
26700 ADD SEARCH,NOKVEC+3 ;# FORCER STRING LIBS ADDED
26800 SUB SEARCH,NOKVEC+7 ;# FORCER LIB DUPLICATIONS
26900 ADD SEARCH,NOKVEC+5 ;# SAVER STONES CAPTURED
27000 HRRM SEARCH,LBSSTR-AFFMOV(TAC2) ;TOT # FORCER "LIBS"
27100 MOVE TAC3,NOKVEC+4 ;# FORCER STONES CAPTURED
27200 ADD TAC3,NOKVEC+10
27300 ADD TAC3,NOKVEC+2 ;# SAVER STRING LIBS ADDED
27400 SUB TAC3,NOKVEC+6 ;# SAVER LIB DUPLICATIONS
27500 HRLM TAC3,LBSSTR-AFFMOV(TAC2) ;TOT # SAVER "LIBS"
27600 TLNN BWREG,NXTTGT
27700 JRST .+5
27800 MOVE TAC1,TAC3 ;POSSIBLE CORRECTION FOR NOKVEC+11
27900 SUB TAC1,TGLIBS
28000 CAMGE TAC1,NOKVEC+11
28100 MOVEM TAC1,NOKVEC+11 ;REMOVE "EXTRA" NEW LIBERTIES
28200 ;**********
28300 ; ESTIMATE THE NUMBER OF LIBERTES "BEYOND" A CAPTURED STRING. THIS
28400 ;MEANS NEW LIBERTIES FROM CONNECTING TO FRIENDLIES NOT ALREADY IN THE
28500 ;TARGET COMPLEX ("THROUGH" THE KILLED STRING). IF THE CAPTURE IS ONLY
28600 ;THREATENED, THEN SET STHRET WHEN (# CAPTURES)+(# NEW LIBS)+(MORLBS) IS
28700 ;ENOUGH TO BE A WINNER FOR SAVER.
28800 ;**********
28900 ;*****ADD LIBS BEYOND MOVER'S CAPTURED STONES
29000 SKIPN FORSAV
29100 SKIPA SEARCH,FSLIBS
29200 MOVE SEARCH,FSLIBS+3
29300 ADDCPM: JUMPE SEARCH,ADDCPN-3
29400 MOVEM SEARCH,STRGNM
29500 ANDI SEARCH,177
29600 PUSHJ PDP,NOCAPW
29700 MOVE TAC1,NOLIBS
29800 SKIPE FORSAV
29900 JRST .+3
30000 ADDM TAC1,MORLBF ;EXTRA FORCER LIBS
30100 JRST .+2
30200 ADDM TAC1,MORLBS ;EXTRA SAVER LIBS
30300 MOVE SEARCH,STRGNM
30400 LSH SEARCH,-7
30500 JRST ADDCPM
30600 ;*****ADD LIBS BEYOND NON-MOVER'S CAPTURED STONES
30700 SKIPN FORSAV
30800 SKIPA SEARCH,FSLIBS+3
30900 MOVE SEARCH,FSLIBS
31000 ADDCPN: JUMPE SEARCH,ADDTHR
31100 MOVEM SEARCH,STRGNM
31200 ANDI SEARCH,177
31300 PUSHJ PDP,NOCAPW
31400 MOVE TAC1,NOLIBS
31500 SKIPE FORSAV
31600 JRST .+3
31700 ADDM TAC1,MORLBS ;EXTRA SAVER LIBS
31800 JRST .+2
31900 ADDM TAC1,MORLBF ;EXTRA FORCER LIBS
32000 MOVE SEARCH,STRGNM
32100 LSH SEARCH,-7
32200 JRST ADDCPN
32300 ;*****SEE IF SAVERS LARGEST THREAT CAN WIN
32400 ADDTHR: SKIPN SEARCH,FSLIBS+4
32500 JRST NOCAPF
32600 SETZ ZER,
32700 MOVEI TAC1,NWSTRG
32800 SKIPE 0(TAC1)
32900 AOJA TAC1,.-1
33000 HRRM TAC1,ADDTH2
33100 ADDTH1: JUMPE SEARCH,ADDTH3
33200 MOVEM SEARCH,STRGNM
33300 ANDI SEARCH,177
33400 PUSHJ PDP,NOCAPW
33500 MOVE SEARCH,STRGNM
33600 ANDI SEARCH,177
33700 LDB TAC5,[POINT 9,STRPTR(SEARCH),26]
33800 ADD TAC5,NOLIBS
33900 ADDTH2: SETZM 0 ;RESETS NEW STRINGS LIST
34000 CAMGE ZER,TAC5
34100 MOVE ZER,TAC5 ;ZER HOLDS BIGGEST THREAT
34200 MOVE SEARCH,STRGNM
34300 LSH SEARCH,-7
34400 JRST ADDTH1
34500 ADDTH3: HRRZ TAC2,T2SAVE
34600 HLRZ TAC5,LBSSTR-AFFMOV(TAC2)
34700 ADD ZER,TAC5
34800 ADD ZER,MORLBS
34900 CAMGE ZER,CUTLBS
35000 JRST NOCAPF-1
35100 CAMLE ZER,CUTLB1
35200 TRO 16,STHRET ;SAVER "REAL" THREAT POINT
35300 SOJLE TAC5,NOCAPF
35400 TLNE 16,FTWOLB
35500 TRO 16,SATTWO ;THREAT AND TWOLIB FOR SAVER
35600 JRST NOCAPF
35700 TRO 16,NSTHRT ;MOVE NOT SAVER THREAT
35800 NOCAPF: MOVE FRIEND,NFRND
35900 ;**********
36000 ; WE MUST FIND OUT WHETHER CONNECTING TO A NEW STRING MEANS WE
36100 ;HAVE CONNECTED TO ONLY THIS STRING OR WHETHER THERE IS A WHOLE SET
36200 ;OF FRIENDLY STRINGS BEHIND THE ONE WE SEE NOW. THE PROGRAM CALCULATES
36300 ;ALL NEW STRINGS AND THE NEW NEIGHBORS OF THESE STRINGS. THE LIBERTIES
36400 ;OF EACH STRING NOT IN THE CURRENT MOVE ARE ADDED AS AN ESTIMATE OF HOW
36500 ;MANY NEW LIBS THE CURRENT MOVE CAN CONNECT TO.
36600 ;**********
36700 SKIPN NWSTRG
36800 JRST NEWNG1
36900 TRO 16,NEWSTG ;MOVE SAW A NEW STRING
37000 TLNN BWREG,CONTGT+NXTTGT
37100 JRST NEWNG1 ;ONLY ADD LIBS TO TARGET HELPERS
37200 MOVEI TAC1,BRDWTH
37300 EXCH TAC1,BNDCNS
37400 MOVEM TAC1,TEMP1 ;SAVE STRING COUNT
37500 MOVEI TAC1,1
37600 MOVEM TAC1,LIBSNO ;GET ATARIED CHASER STRINGS TOO
37700 ;*****ADD NWSTRG LIST TO AFFECTED STRING LIST
37800 SKIPE AFFSTR(TAC1)
37900 AOJA TAC1,.-1
38000 MOVEM TAC1,TEMP2 ;SAVE END OF AFFECTED STRING LIST
38100 SETZ TAC2,
38200 NEWNG2: SKIPN SEARCH,NWSTRG(TAC2)
38300 SOJA TAC1,NEWNG3
38400 LDB TAC3,[POINT 9,STRPTR(SEARCH),17]
38500 TDNN FRIEND,GB1(TAC3)
38600 SAILERR <6> ;NEW STRINGS SHOULD ONLY BE FRIENDLY
38700 ;**** ERROR MESSAGE 6 ****
38800 MOVEM SEARCH,AFFSTR(TAC1)
38900 AOJ TAC2,
39000 AOJA TAC1,NEWNG2
39100 NEWNG3: SETZM AFFSTR+1(TAC1) ;MARK END OF AUGMENTED LIST
39200 ;*****CHECK THESE NEW STRINGS FOR NEIGHBORS
39300 CAMGE TAC1,TEMP2
39400 JRST NEWNG4-2
39500 HRRZ SEARCH,AFFSTR(TAC1) ;GET STRING NAME
39600 PUSH PDP,TAC1
39700 PUSHJ PDP,NEIGHS
39800 POP PDP,TAC1
39900 SOJA TAC1,NEWNG3+1
40000 ;*****FIND NUMBER OF ADDED LIBERTIES
40100 SETZ TAC3, ;HOLDS # OF LIBS GAINED
40200 MOVE TAC1,TEMP2
40300 NEWNG4: SKIPN SEARCH,AFFSTR(TAC1)
40400 JRST NEWNG5
40500 SETZ TAC2,
40600 SKIPN TAC4,GRUPNO(TAC2)
40700 JRST .+4
40800 CAME TAC4,SEARCH
40900 AOJA TAC2,.-3
41000 AOJA TAC1,NEWNG4 ;STRING IS PART OF PROPOSED MOVE
41100 LDB TAC,[POINT 9,STRPTR(SEARCH),17]
41200 TDNN FRIEND,GB1(TAC)
41300 AOJA TAC3,NEWNG5-1 ;ADD LIB FOR ATARIED CHASER
41400 LDB TAC4,[POINT 9,STRPTR(SEARCH),35]
41500 SOJLE TAC4,NEWNG5-1 ;TAKE NOTE OF POSSIBLE DUPLICATION
41600 SOJLE TAC4,NEWNG5-1
41700 ADD TAC3,TAC4
41800 AOJA TAC1,NEWNG4
41900 ;*****FINISH UP AND RESTORE REGISTERS
42000 NEWNG5: TLNE 16,NEWCGT
42100 SOSLE TAC3 ;COMPENSATE FOR DUP CONTGT POINT
42200 ADDM TAC3,MORLBS ;ADD ON EXTRA NEIGHBOR LIBS
42300 MOVE TAC1,TEMP2
42400 SETZM AFFSTR(TAC1) ;RESTORE AFFECTED STRINGS LIST
42500 MOVE TAC1,TEMP1
42600 MOVEM TAC1,BNDCNS ;RESTORE STRING COUNT
42700 NEWNG1: HRRZ TAC2,T2SAVE ;RESTORE MOVE LIST INDEX
42800 HRRZ TAC,BWREG ;RESTORE CURRENT BOARD OFFSET
42900 HRRZ SEARCH,LBSSTR-AFFMOV(TAC2)
43000 HLRZ TAC3,LBSSTR-AFFMOV(TAC2)
43100 ;*****MARK ILLEGAL AND SELF-ATARI MOVES FOR BOTH FORCER AND SAVER.
43200 ;*****ALSO ADD ON LIBERTIES FROM "CONNECTIONS" IF THE MOVE ALREADY
43300 ;*****HAS AT LEAST TWO LIBERTIES ON ITS OWN
43400 CAIL TAC3,2
43500 JRST NOCAG1
43600 TRZ 16,SREVIV ;THIS IS NOT REAL REVIVAL
43700 TLNE 16,KOTAKS
43800 JRST NOCAG1 ;TAKES TWO MOVES TO RETAKE SAVER KO
43900 JUMPE TAC3,.+3
44000 TLNN BWREG,NXTTGT
44100 TLOA 16,SSATE ;SAVER SELF-ATE
44200 TLOA 16,SILLPT ;SAVER "ILLEGAL" MOVE
44300 TLNE BWREG,CAPFRD+CAPENM
44400 SKIPN TAC1,NOKVEC+4
44500 JRST NOCAG2
44600 ADDM TAC1,NOKVEC+11 ;CAPTURED STONES ARE NEW LIBS
44700 CAILE SEARCH,1
44800 TLO BWREG,NATARI ;NOT REALLY SELF-ATARI FOR SAVER
44900 JRST NOCAG2
45000 NOCAG1: MOVE TAC1,MORLBS ;LIBS FROM CONNECTION TO NEW STRINGS
45100 SKIPE FORSAV
45200 JRST .+3
45300 SKIPG NOKVEC+11
45400 TRZ 16,STHRET ;FORCER MOVE+NO NEW SAVER LIBS=NO THREAT
45500 TRNE 16,STHRET
45600 ADDI TAC1,1 ;ADD ONE EXTRA LIBERTY FOR SAVER THREAT
45700 ADD TAC3,TAC1
45800 ADDM TAC1,NOKVEC+11
45900 ADDM TAC1,NOKVEC+2 ;# SAVER STRING LIBS
46000 HRLM TAC3,LBSSTR-AFFMOV(TAC2)
46100 TLNN BWREG,NXTTGT
46200 JRST NCAG11
46300 MOVE TAC1,TAC3 ;WHEN NXTTGT, WE CAN SET
46400 SUB TAC1,TGLIBS ;# "NEW" LIBS DIRECTLY
46500 MOVEM TAC1,NOKVEC+11
46600 NCAG11: SKIPN TAC1,FSLIBS+4 ;FORCER STRINGS THREATENED
46700 JRST NOCAG2
46800 TRNE TAC1,37600
46900 JRST NOCAG2-1
47000 TLNN 16,FTWOLB
47100 JRST NOCAG2
47200 TROA 16,SATTWO ;SAVER ATARIS AND TWOLIBS FORCER
47300 TRO 16,SDBLAT ;SAVER ATARIS TWO FORCER STRINGS
47400 NOCAG2: CAIL SEARCH,2
47500 JRST NOCAG3
47600 TLNE BWREG,NXTTGT
47700 TRO 16,SEMPT ;FORCER CANT GRACEFULLY MOVE HERE
47800 TRZ 16,SREVIV ;THIS REVIVAL DOESNT AFFECT FORCER
47900 TLNE 16,KOTAKF
48000 JRST NOCAG4 ;TAKES TWO MOVES TO RETAKE KO
48100 CAIE SEARCH,1
48200 TLOA 16,FILLPT ;ILLEGAL MOVE FOR FORCER
48300 TLO 16,FSATE ;SELF-ATARI MOVE FOR FORCER
48400 JRST NOCAG4
48500 NOCAG3: MOVE TAC1,MORLBF ;FORCER LIBS FROM BEYOND CAPTURE
48600 ADD SEARCH,TAC1
48700 ADDM TAC1,LBSSTR-AFFMOV(TAC2)
48800 ADDM TAC1,NOKVEC+3 ;# FORCER STRING LIBS
48900 MOVE TAC1,FSLIBS+1 ;SAVER STRINGS THREATENED BY FORCER
49000 TRNE TAC1,37600
49100 TRO 16,FDBLAT ;FORCER THREATENS TWO STRINGS
49200 SKIPN FORSAV
49300 TRNN 16,FTHRET
49400 JRST NOCAG4
49500 MOVEI TAC3,2(TAC3) ;BONUS FOR FORCER MAYLAD
49600 HRLM TAC3,LBSSTR-AFFMOV(TAC2);THREAT ON TARGET STRING
49700 MOVEM TAC3,NOKVEC+11 ;THESE ARE NEW PSEUDO-LIBS
00100 ;*****LINES 1 AND 2 ARE TO BE AVOIDED, ALL ELSE BEING EQUAL
00200 NOCAG4: IDIVI TAC,BRDWTH
00300 CAIE TAC,1
00400 CAIN TAC,BRDWTH-2
00500 JRST NONLIN+1
00600 CAIE TAC1,1
00700 CAIN TAC1,BRDWTH-2
00800 JRST NONLIN+1
00900 CAIE TAC,2
01000 CAIN TAC,BRDWTH-3
01100 JRST NONLIN
01200 CAIN TAC1,2
01300 JRST NONLIN
01400 CAIE TAC1,BRDWTH-3
01500 TLO BWREG,NON2ND ;ABOVE SECOND LINE
01600 NONLIN: TLOA BWREG,NON1ST ;ON SECOND LINE
01700 TRZ 16,LADBRK ;NO LADDER BREAK ON FIRST LINE
01800 HRRZ TAC,BWREG
01900 ;*****LOOK AT LOW-LIBERTY MOVES AND POSSIBLE WINNERS
02000 SKIPN FORSAV
02100 JRST TRYEY2
02200 TLNE 16,SILLPT
02300 JRST ILLPRP-1
02400 TLNE 16,SSATE
02500 JRST NONIL1 ;SAVER SELF-ATARI MOVE
02600 SKIPE NOTWIN
02700 JRST TRYEY3
02800 TLNN BWREG,NXTTGT
02900 JRST TRYEY4
03000 CAMG TAC3,CUTLB1
03100 JRST TRYEY3
03200 SAVXTD: TLNE BWREG,CAPENM+CAPFRD
03300 JRST SAVCAP
03400 TLNE BWREG,NXTTGT
03500 SKIPA TAC5,[-11] ;SAVER WINS BY DIRECT EXTENSION
03600 MOVNI TAC5,12 ;SAVER WINS BY NON-EXTENSION MOVE
03700 JRST STOPIT
03800 SAVCAP: MOVNI TAC5,4
03900 JRST STOPIT ;SAVER WINNER BY CAPTURE OF CHASING STONES
04000 TRYEY4: SKIPE MSTSAV
04100 JRST TRYEY3 ;TARGET CAN BE LADDERED
04200 TLNE BWREG,CONTGT
04300 SKIPE SVCRIT
04400 JRST TRYEY3
04500 CAMLE TAC3,CUTLB2
04600 JRST SAVXTD
04700 TRYEY3: TLNE 16,FILLPT
04800 JRST NOTRY0
04900 TLNN 16,FSATE
05000 JRST NONIL1-1 ;NOT ATARI FOR EITHER SIDE
05100 TLNN BWREG,CAPFRD
05200 JRST NONIL1
05300 JRST NONIL1-1 ;SAVES FRIENDLY STONES
05400 TRYEY2: JUMPE SEARCH,TRYEY1 ;TRY FOR SAVER EYE
05500 SKIPG TAC3
05600 JRST NONIL1 ;ILLEGAL MOVE FOR SAVER
05700 CAME TAC,KOSAV1
05800 JRST NOTKO
05900 TLO 16,FILLPT
06000 CAML TAC4,CUTLB2
06100 SKIPE NOTWIN
06200 JRST ILLPRP-1
06300 MOVNI TAC5,3 ;LOSS BY KO
06400 JRST STOPIT
06500 NOTKO: TLNE 16,FSATE
06600 JRST CONSTR ;FORCER SELF-ATARI POINT
06700 TLNN BWREG,NXTTGT
06800 TLNN 16,SSATE
06900 JRST NONIL1-1 ;NEXT TARGET OR NOT SAVER SELF-ATE
07000 TLNN BWREG,CAPFRD
07100 JRST NONIL1
07200 JRST NONIL1-1 ;SAVES FRIENDLY STONES
07300 ;*****THIS CODE TESTS FOR SAVER EYE
07400 TRYEY1: CAIG TAC3,1
07500 JRST ILLPRP-1 ;SAVER SELF-ATARI AND FORCER SELF-ATARI
07600 NOTRY0: MOVEI TAC1,BCON+WCON
07700 TDNE TAC1,GBOARD(TAC)
07800 JRST TRYEYE ;THIS IS FRIENDLY GROUP POINT
07900 NOTRY: SKIPN FORSAV
08000 JRST ILLPRP-1 ;ILLEGAL FORCER MOVE
08100 JRST NONIL1-1
08200 TRYEYE: TLNN BWREG,CONTGT+NXTTGT
08300 JRST NOTRY ;THIS POSSIBLE EYE NOT IN TARGET COMPLEX
08400 PUSHJ PDP,EYDIAG
08500 CAIGE TAC2,5 ;TAC2 CONTAINS EYEMAKING SCORE
08600 JRST NOTRY1
08700 HRRZ TAC2,T2SAVE
08800 AOSG EYECNT
08900 JRST ILLPRP-1 ;DONT PLAY ON OWN EYE
09000 TWOEYE: MOVNI TAC5,=13
09100 JRST STOPIT ;TWO EYES STOP
09200 ;*****SEE IF THIS POINT CAN BE MADE INTO AN EYE
09300 NOTRY1: CAIL TAC2,3
09400 JRST .+3
09500 HRRZ TAC2,T2SAVE ;CANT MAKE THIS AN EYE IN ONE MOVE
09600 JRST NOTRY
09700 SETZM REGSTR+1 ;FLAG TO SEE IF CAN MAKE EYE
09800 MOVEI TAC1,3
09900 NOTRY3: HRRZ TAC5,EYENUM(TAC1)
10000 JUMPE TAC5,NOTRY4
10100 MOVEI TAC3,AFFMOV
10200 HRRZ TAC4,0(TAC3)
10300 JUMPE TAC4,NOTRY2
10400 CAME TAC4,TAC5
10500 AOJA TAC3,.-3
10600 NOTRY7: MOVE TAC4,0(TAC3)
10700 TLO TAC4,EYMAKE ;REWARD EYEMAKING POINT
10800 SKIPN FORSAV
10900 JRST .+3
11000 TLZE TAC4,400000 ;MAKE SURE THIS MOVE IS LEGAL FOR SAVER
11100 SOS BNDCNL
11200 MOVEM TAC4,0(TAC3)
11300 SETOM REGSTR+1 ;CAN MAKE EYE
11400 SKIPL EYECNT
11500 SKIPN FORSAV
11600 JRST NOTRY2-1
11700 HRRZ BWREG,0(TAC3) ;EYEMAKING POINT
11800 JRST TWOEYE
11900 ;*****LOOK FOR CAPTURABLE ENEMY STRING TO MAKE EYE
12000 NOTRY4: MOVE TAC5,@G1DIAG(TAC1)
12100 TRNE TAC5,BLKOCC+WHTOCC
12200 TDNE TAC5,FRIEND
12300 JRST NOTRY2 ;NOT ENEMY STRING POINT
12400 ANDI TAC5,177
12500 LDB TAC2,[POINT 9,STRPTR(TAC5),35]
12600 CAIE TAC2,1
12700 JRST NOTRY2 ;TOO MANY LIBS IN ENEMY STRING
12800 MOVEI TAC3,AFFMOV
12900 NOTRY5: HRRZ TAC,0(TAC3)
13000 JUMPE TAC,NOTRY2-1 ;CANT FIND THE LIBERTY
13100 MOVEI TAC4,3
13200 LDB TAC2,[POINT 7,@GB1TST(TAC4),35]
13300 CAIN TAC2,TAC5
13400 JRST NOTRY7 ;FOUND THE STRING LIB
13500 SOJGE TAC4,.-3
13600 AOJA TAC3,NOTRY5
13700 HRRZ TAC,BWREG ;RESTORE THE BOARD BASE REGISTER
13800 NOTRY2: SOJGE TAC1,NOTRY3
13900 HRRZ TAC2,T2SAVE
14000 SKIPE REGSTR+1
14100 JRST ILLPRP-1 ;MARK PROTO-EYE UNACCEPTABLE
14200 JRST NOTRY ;THIS IS NOT A PROTO-EYE
14300 TLO BWREG,NATARI ;NOT SELF-ATARI FOR SIDE MOVING
14400 NONIL1: SUB SEARCH,NOKVEC+10
14500 CAMGE SEARCH,NOKVEC+2 ;# SAVER STRING LIBS
14600 TLO BWREG,WKSIDE ;NEAR FORCER WEAKNESS
14700 ;*****NOTE CHANGE IN DEFINITION OF REGISTER "SEARCH"
14800 HLRZ SEARCH,LBSSTR-AFFMOV(TAC2) ;"REAL" SAVER LIBS
14900 ;**********
15000 ; EXPAND THE NUMBER OF MOVES CONNECTED TO THE TARGET COMPLEX BY CHECKING
15100 ;A "REAL" NXTTGT OR CONTGT POINT FOR THESE CONDITIONS:
15200 ;1. FORCER HAS ≤2 LIBS NOW AND HAS NO SNAPBACK
15300 ;2. SAVER CAN MAKE A BAMBOO JOINT OR DIAGONAL CONNECTION NEARBY
15400 ;3. NEIGHBOR POINT IS "REAL" NXTTGT OR CONTGT AND NO SNAPBACK
15500 ; THE NEWCGT BIT IS TURNED ON IN AUXBTS TO NOTE ANY CONTGT AWARD BY
15600 ;THIS CODE. LADBRK IS TURNED ON WHEN FORCER CAN CUT NEW MOVE OFF FROM
15700 ;TARGET COMPLEX. IF THE NEW MOVE IS NOT ON THE AFFECTED MOVES LIST AND
15800 ;SAVER IS MOVING, THEN ADD THE MOVE TO THE LIST.
15900 ;**********
16000 TLNE BWREG,NXTTGT+CONTGT
16100 TLNE 16,NEWCGT ;DONT EXPAND "NEW" CONTGT
16200 JRST SAVEX1+1
16300 SKIPE SVCRIT
16400 JRST SAVEX1+1
16500 MOVEI BLANK,BNKOCC
16600 SETZM TEMP1
16700 HRRZ TAC1,NOKVEC+1 ;# FORCER ACTUAL LIBS
16800 SUBI TAC1,2
16900 JUMPLE TAC1,.+2
17000 TLNN 16,SNACAP+SNACPN
17100 TLNE 16,SURCAP
17200 JRST SAVX02 ;SNAPBACK
17300 SKIPN FORSAV
17400 JRST SAVX02
17500 SOJL TAC1,SAVEX2 ;SAVER EXPANSION OK
17600 PUSHJ PDP,NXCSRC
17700 JUMPE TAC5,SAVX03+1 ;ONLY DIAG IS POSSIBLE
17800 CAILE TAC1,0
17900 AOSA TEMP1 ;FORCER CAN EASILY CUT
18000 SOS TEMP1 ;FORCER CAN POSSIBLY CUT
18100 ;*****BAMBOO JOINT AVAILABILITY CHECK
18200 SAVX02: MOVEI TAC4,3
18300 TDNE FRIEND,@G1DIAG(TAC4)
18400 TDNN FRIEND,@G1DIAG+1(TAC4)
18500 JRST SAVX03
18600 TDNN BLANK,@GB1TST(TAC4)
18700 JRST SAVX03
18800 TDNE FRIEND,@GB1TST+1(TAC4)
18900 TDNN BLANK,@GB1TST+3(TAC4)
19000 JRST .+2
19100 JRST SAVX04
19200 TDNE FRIEND,@GB1TST+3(TAC4)
19300 TDNN BLANK,@GB1TST+1(TAC4)
19400 JRST SAVX03
19500 SAVX04: SETOM TEMP1 ;DONT COUNT THIS AS WINNER
19600 JRST SAVEX2 ;AT BAMBOO JOINT
19700 SAVX03: SOJGE TAC4,SAVX02+1
19800 ;*****DIAGONAL CONNECTION AVAILABILITY CHECK
19900 MOVEI TAC1,3
20000 SAVX06: TDNN FRIEND,@GB1TST(TAC1)
20100 JRST SAVX05
20200 LDB TAC3,[POINT 7,@GB1TST(TAC1),35]
20300 MOVEI TAC4,AFFSTR+1
20400 HRRZ TAC5,0(TAC4)
20500 JUMPE TAC5,SAVX05 ;"FRIEND" NOT AN AFFECTED STRING
20600 CAME TAC5,TAC3
20700 AOJA TAC4,.-3
20800 MOVEI TAC,@GODOWN(TAC1)
20900 MOVEI TAC4,3
21000 SAVX07: TDNE BLANK,@GB1TST(TAC4)
21100 TDNN BLANK,@GB1TST+1(TAC4)
21200 JRST SAVX05-2
21300 TDNN BLANK,@G1DIAG+1(TAC4)
21400 JRST SAVX05-2
21500 MOVEI TAC,@G1DIAG+1(TAC4)
21600 SUBI TAC,GB1 ;SET TAC AT DIAG POINT
21700 SETO TAC1, ;DISABLE SAVEX2 LOOP
21800 SETZM TEMP1 ;POINT CAN BE SAVER WINNER
21900 JRST SAVX22
22000 SOJGE TAC4,SAVX07
22100 HRRZ TAC,BWREG
22200 SAVX05: SOJGE TAC1,SAVX06
22300 SKIPN TEMP1
22400 JRST SAVEX1+1 ;DONT EXPAND THIS POINT
22500 ;*****EXPANSION/CONTGT AWARDING LOOP
22600 SAVEX2: MOVEI TAC1,3
22700 TDNN BLANK,@GB1TST(TAC1)
22800 JRST SAVEX1
22900 MOVEI TAC,@GODOWN(TAC1)
23000 SAVX22: SETZ REPLCE,
23100 MOVEI TAC4,AFFMOV
23200 SKIPN TAC5,0(TAC4)
23300 JRST SAVEX3 ;MOVE NOT ON MOVE LIST
23400 CAIE TAC,0(TAC5)
23500 AOJA TAC4,.-3
23600 TLNN TAC5,NXTTGT
23700 JRST SAVEX4
23800 TROA 16,SEMPT ;DEMOTE CURRENT NXTTGT POINT TO CONTGT
23900 SAVEX3: SKIPN FORSAV
24000 JRST SAVEX1-1 ;DONT EXPAND FORCER MOVE LIST
24100 SOSG BNDCNL
24200 JRST LEXCSS
24300 PUSHJ PDP,TACMRK
24400 MOVE TAC5,TAC
24500 SETZM 1(TAC4) ;NEW END FOR AFFECTED MOVE LIST
24600 SAVEX4: TLON TAC5,CONTGT
24700 TLO REPLCE,NEWCGT ;"NEW" CONTGT POINT
24800 SKIPGE TAC3,TEMP1
24900 JRST SAVX41
25000 JUMPE TAC3,SAVX41+1
25100 TLZE REPLCE,NEWCGT
25200 TLZ TAC5,CONTGT
25300 SAVX41: TRO REPLCE,LADBRK
25400 SKIPL TAC1 ;DON'T SEMPT FOR DIAGONAL CONNECTION
25500 TRO 16,SEMPT
25600 MOVEM TAC5,0(TAC4)
25700 ORM REPLCE,AUXBTS-AFFMOV(TAC4)
25800 HRRZ TAC,BWREG
25900 SAVEX1: SOJGE TAC1,SAVEX2+1
26000 ;*****TRY FOR INSTANT LOSERS AND WINNERS
26100 TLNE BWREG,NXTTGT
26200 CAILE SEARCH,1
26300 JRST ACCEP1
26400 SKIPE FORSAV
26500 JRST ILLPRP ;TOT LIBS COUNT IS ONLY ONE
26600 ACCEP1: SKIPN SVCRIT
26700 SKIPE NOTWIN
26800 JRST NFRCR
26900 ;**********
27000 ; LOOK FOR WINNING MOVES FOR SAVER. THIS MEANS A MOVE
27100 ;WHICH GIVES THE TARGET MORE THAN THE "ESCAPE" NUMBER OF
27200 ;LIBERTIES. FORCER GIVES UP IF THERE ARE THREE OR MOVE WAYS FOR
27300 ;SAVER TO WIN.
27400 ;**********
27500 TLNE BWREG,NXTTGT+CONTGT
27600 TRNE 16,LADBRK
27700 JRST NFRCR
27800 CAMG SEARCH,CUTLBS ;CHECK FOR INSTANT WINNER
27900 JRST NFRCR ;TOTAL LIBS OF SAVER <4
28000 SKIPE FORSAV
28100 JRST ACCSAV ;MAY BE A SAVER WINNER
28200 CAMGE SEARCH,CUTLB2
28300 JRST NFRCR ;NOT A FORCER FORCE
28400 SKIPN TAC1,FSLIBS+3
28500 JRST ACCSV2+2
28600 ;*****THIS MOVE WINS BY CAPTURING STONES
28700 TLNE 16,LADLSM
28800 JRST SAVXTD ;FORCER MUST SAVE DEAD STRING
28900 TLNE 16,FILLPT+FSATE
29000 JRST ILLPRP-1 ;REALLY BAD FORCER MOVE
29100 AOS SAVWN1
29200 CAIL TAC1,177
29300 JRST ACCSV2-2
29400 TRNN 16,LADLOS
29500 JRST ACCSV2
29600 CAMN TAC1,MSTSAV ;LADDERED STRING NAME
29700 SOSA SAVWN1 ;COUNTS LADDER WINNERS
29800 MOVEM TAC1,MSTSAV
29900 JRST ACCSV1
30000 ACCSV2: MOVEM TAC1,MUSTSV ;DIRECT CAPTURE STRING NAME
30100 JRST ACCSV1
30200 TLNE 16,FILLPT+FSATE
30300 JRST SAVXTD
30400 ;*****SAVE TARGET COMPLEX EXTENSION
30500 ACCSV1: SKIPN XTDFRC
30600 JRST ACCSAV-1
30700 SKIPN XTDFR1
30800 JRST ACCSAV-3
30900 TWOPRB: MOVNI TAC5,14 ;***TOO MANY WINNERS LOSS
31000 JRST SEXCSS+1
31100 HRRZM BWREG,XTDFR1
31200 JRST ACCSAV
31300 HRRZM BWREG,XTDFRC
31400 ;*****RECORD EXTENSION TYPE
31500 ACCSAV: AOS SAVWIN
31600 TLNE BWREG,NXTTGT
31700 SOSA CONFLG ;NEXT-TO-TARGET WINNER
31800 ADDM TAC2,CONFLG
31900 SKIPN FORSAV
32000 JRST NFRCR
32100 TLNN BWREG,NON1ST ;ON FIRST LINE?
32200 JRST .+3
32300 TLNE BWREG,NON2ND ;ON SECOND LINE?
32400 SKIPE MSTSAV ;CAN TARGET BE LADDERED?
32500 SOSA SAVWIN ;DONT COUNT THIS "WINNER"
32600 JRST SAVXTD
32700 ;**********
32800 ; CALCULATE THE NUMBER OF NEW LIBERTIES THE MOVE BRINGS TO
32900 ;THE TARGET COMPLEX. THIS IS DONE MORE OR LESS EXACTLY FOR MOVES
33000 ;NEXT TO THE TARGET AND MOVES NEXT TO THE TARGET COMPLEX. OTHER
33100 ;MOVES ARE WORKED ON ONLY IF THEY HAVE SOME SPECIAL PROPERTY.
33200 ;**********
33300 NFRCR: TLNE BWREG,NXTTGT
33400 TLZ BWREG,CONTGT ;ELIMINATE NXTTGT+CONTGT DUPLICATION
33500 TLNE BWREG,NXTTGT+CONTGT
33600 TRZ 16,SREVIV ;ELIMINATE CONTGT+SREVIV DUPLICATION
33700 TLNE 16,LADLSM+LADLSN
33800 JRST ACCEPT ;DONT PLAY ON LADDER LOSS POINT
33900 MOVE REPLCE,NOKVEC+11 ;ESTIMATE OF "NEW" LIBERTIES
34000 TLNE BWREG,NXTTGT
34100 JRST NFRCR0
34200 TLNE BWREG,CONTGT
34300 JRST .+3
34400 TRNN 16,SATTWO+FDBLAT
34500 JRST ACCEPT-1
34600 TLNN BWREG,TWOATE
34700 JRST NFRCR0-1
34800 SKIPE NWSTRG
34900 JRST NFRCR0
35000 JUMPE REPLCE,NFRCR1-1
35100 SUBI REPLCE,1 ;DISCOURAGE CONTGT BY ONE LIB
35200 NFRCR0: CAMG SEARCH,REPLCE
35300 SOJA REPLCE,NFRCR0 ;MUST HAVE "NEW" LIBS < TOTAL LIBS
35400 TLNN BWREG,EYMAKE
35500 JUMPL REPLCE,NFRCR1
35600 JUMPG REPLCE,.+4
35700 TLO BWREG,NREDUC
35800 NFRCR1: TRO 16,SEMPT
35900 JRST ACCEPT
36000 CAIGE REPLCE,3
36100 JRST NFRC31
36200 ;*****SEE IF LAST FORCER MOVE HELPED SAVER BY ALLOWING SAVER TO
36300 ;*****CAPTURE IT AND GAIN ≥3 LIBERTIES AT THE SAME TIME
36400 SKIPE FORSAV
36500 SKIPN TAC1,FSLIBS+3
36600 JRST NFRCR3
36700 MOVE TAC5,NDXFOR
36800 CAILE TAC5,5
36900 CAIL TAC1,177 ;>1 CAPTURED STRING
37000 JRST NFRCR3 ;FORCER HASNT MOVED YET
37100 LDB TAC4,[POINT 9,STRPTR(TAC1),17]
37200 ADD TAC5,PNTDPY
37300 CAME TAC4,-5(TAC5)
37400 CAMN TAC4,-4(TAC5)
37500 JRST NFRCR3-2
37600 CAMN TAC4,-3(TAC5)
37700 JRST NFRCR3-2
37800 CAME TAC4,-2(TAC5)
37900 JRST NFRCR3
38000 MOVNI TAC5,7 ;THIS GOOD MOVE CAPTURES THE LAST
38100 JRST STOPIT ;FORCER MOVE, "REFUTING" IT.
38200 NFRCR3: CAIG REPLCE,3
38300 JRST NFRC31
38400 TLO BWREG,EYMAKE ;≥4 NEW LIBERTIES IS AT LEAST
38500 SUBI REPLCE,3 ;AS GOOD AS MAKING AN EYE
38600 CAILE REPLCE,3
38700 MOVEI REPLCE,3
38800 NFRC31: TRNE REPLCE,1
38900 TLO BWREG,NEWLIB ;NOTE MOVE ADDS NEW LIB
39000 TRNE REPLCE,2
39100 TLO BWREG,NWLIB2 ;NOTE MOVE ADDS 2 NEW LIBS
39200 TLO BWREG,NREDUC
39300 ;*****THERE MUST BE A CERTAIN MINIMUM OF LIBERTIES FOR SEVERAL BITS
39400 ;*****TO MAKE SENSE. A LIBERTIES VIOLATION DETECTED BELOW TURNS OFF
39500 ;*****THE BIT IN CASE IT HAS BEEN SET.
39600 ACCEPT: HRRZ TAC5,NOKVEC ;SAVER LIBS
39700 HRRZ TAC4,NOKVEC+1 ;FORCER LIBS
39800 ;*****MAKE NEW WKNTGT STRING?
39900 TLNE 16,FTWOLB
40000 TRNE 16,STHRET+NSTHRT
40100 JRST ACEPT2
40200 CAIGE TAC5,3
40300 TLNE BWREG,TWOATE
40400 TLO BWREG,WKNTGT
40500 ;*****IS THIS GOOD POINT FOR BOTH SIDES?
40600 CAIL TAC4,4
40700 CAIGE TAC5,3
40800 JRST ACEPT2
40900 TLNN BWREG,WKNTGT
41000 JRST ACEPT2
41100 TLOE BWREG,NEWLIB ;GOOD POINT FOR BOTH GETS EXTRA
41200 TLO BWREG,NWLIB2 ;LIB TO REPRESENT ITS URGENCY
41300 ACEPT2: TLNE 16,LADLSM
41400 JRST ACEPT1 ;LADDER LOSS POINT
41500 SKIPE FORSAV
41600 JRST .+5
41700 TLNE 16,FSATE
41800 TLNE 16,KOTAKF
41900 JRST ACEPT1+1 ;KO TAKE OR NOT SELF ATE
42000 JRST ACEPT1
42100 TLNN 16,SSATE
42200 JRST ACEPT1+1
42300 TLNN 16,KOTAKS
42400 ACEPT1: TLZ BWREG,CAPFRD+THRTGS ;AIDS FORWARD PRUNING
42500 SKIPN FORSAV
42600 TLNN BWREG,SAVTGS
42700 JRST ACEPT3
42800 CAIN TAC5,2
42900 TLO 16,FORHLP ;SAVER ATARIES FORCER HERE
43000 ACEPT3: MOVEM 16,AUXBTS-AFFMOV(TAC2)
43100 MOVEM BWREG,0(TAC2)
43200 AOJA TAC2,PRPLOP
00100 ;*****SEE ABOUT MAKING EYES WITH PROPOSED MOVES. CONSIDER THE CASE OF
00200 ;*****CAPTURING NO MEN OR EXACTLY ONE MAN.
00300 BUBLP2: MOVEI TAC4,AFFMOV
00400 MOVE FRIEND,NFRND ;NOTE THAT EYCHEK REQUIRES THAT
00500 XORI FRIEND,BLKOCC+WHTOCC ;FRIEND MATCHES ENEMY OCCUPIED POINT
00600 BUBL21: HRRZ TAC1,LBSSTR-AFFMOV(TAC4) ;FORCER LIBS
00700 SKIPN TAC,0(TAC4)
00800 JRST BUBLPX
00900 TLNN TAC,NXTTGT+CONTGT
01000 AOJA TAC4,BUBL21 ;NOT NXTTGT OR CONTGT SO CANT MAKE EYE
01100 CAIN TAC1,1
01200 JRST EYEMKA ;FOUND TIGERMOUTH
01300 EYEMKH: SKIPE FORSAV
01400 SKIPA TAC1,[CAPENM*1000000]
01500 HRLZI TAC1,CAPFRD
01600 TDNN TAC,TAC1
01700 EYEMKB: AOJA TAC4,BUBL21
01800 HRRZ TAC,TAC ;FOUND ATARI OF FORCER POINT
01900 MOVEM TAC,TACSV1 ;USED BY EYCHEK
02000 MOVEI TAC1,3
02100 EYEMKD: MOVE SEARCH,@GB1TST(TAC1)
02200 TRNE SEARCH,BLKOCC+WHTOCC
02300 TDNE SEARCH,NFRND
02400 JRST EYEMKC
02500 ANDI SEARCH,177
02600 MOVE TAC3,STRPTR(SEARCH)
02700 TRNN TAC3,776000 ;ONE-MAN STRING
02800 TRNE TAC3,776 ;ONE-LIB STRING
02900 JRST EYEMKC
03000 MOVE REPLCE,TAC4 ;INDEX OF TO-BE-REWARDED POINT
03100 MOVEI TAC,@GODOWN(TAC1)
03200 JRST EYEMKG
03300 EYEMKC: SOJGE TAC1,EYEMKD
03400 AOJA TAC4,BUBL21
03500 EYEMKA: MOVE TAC1,NFRND
03600 CAIE TAC1,BLKOCC
03700 SKIPA TAC1,[WCON]
03800 MOVEI TAC1,BCON
03900 TDNN TAC1,GBOARD(TAC)
04000 JRST EYEMKH ;NOT GROUP POINT, TRY FOR CAPTURE
04100 HRRZ TAC,TAC
04200 MOVEI TAC2,3
04300 MOVEI BLANK,BNKOCC ;FIND BLANK NEXT TO CURRENT POINT
04400 TDNN BLANK,@GB1TST(TAC2)
04500 SOJGE TAC2,.-1
04600 JUMPL TAC2,BUBL21+1 ;NO BLANK, TRY FOR CAPTURE
04700 MOVEI REPLCE,AFFMOV
04800 HRRZ TAC3,0(REPLCE)
04900 JUMPE TAC3,BUBL21+1
05000 CAIE TAC3,@GODOWN(TAC2) ;FOUND INDEX FOR REWARD POINT
05100 AOJA REPLCE,.-3
05200 MOVEM TAC3,TACSV1 ;USED BY EYCHEK
05300 EYEMKG: PUSHJ PDP,EYCHEK
05400 CAIE TAC1,2000
05500 AOJA TAC4,BUBL21 ;PLAY DOES NOT MAKE EYE
05600 MOVE TAC5,0(REPLCE)
05700 TLO TAC5,EYMAKE ;REWARD EYEMAKING POINT
05800 TLOE TAC5,NREDUC
05900 SKIPE FORSAV
06000 JRST EYEMKX
06100 MOVE TAC3,NDXFOR
06200 CAILE TAC3,=10
06300 CAME REPLCE,TAC4
06400 JRST EYEMKX
06500 ;*****SEE IF EYEMAKING CAPTURE WAS LAST FORCER MOVE
06600 ADD TAC3,PNTDPY
06700 CAME TAC,-=10(TAC3)
06800 CAMN TAC,-=9(TAC3)
06900 JRST EYEMKX-2
07000 CAMN TAC,-=8(TAC3)
07100 JRST EYEMKX-2
07200 CAME TAC,-=7(TAC3)
07300 JRST EYEMKX
07400 MOVNI TAC5,=14 ;THIS GOOD MOVE MAKES AN EYE WITHOUT
07500 JRST STOPIT ;LOSING A LIBERTY. FURTHERMORE, THE
07600 ;CAPTURE IS OF FORCER'S LAST MOVE.
07700 EYEMKX: MOVE TAC3,AUXBTS-AFFMOV(REPLCE)
07800 TLNE TAC3,LADLSM+LADLSN
07900 ;*****SHOULD CHECK TO SEE IF LADDER LOSS CAN WRECK EYE
08000 JRST EYEMKZ ;INSTANT LADDER LOSS DOESNT STOP EYE
08100 SKIPN FORSAV
08200 JRST .+3
08300 TLZE TAC5,400000 ;MAKE SURE MOVE LEGAL FOR SAVER
08400 SOS BNDCNL
08500 MOVEM TAC5,0(REPLCE)
08600 EYEMKZ: CAMN TAC4,REPLCE
08700 JRST EYEMKY
08800 MOVE TAC5,0(TAC4)
08900 TLZ TAC5,377777-(NXTTGT+CONTGT+WKNTGT)
09000 TLON TAC5,400000
09100 AOS BNDCNL
09200 MOVEM TAC5,0(TAC4) ;DONT PLAY INTO EYE POINT
09300 EYEMKY: SKIPL EYECNT
09400 SKIPN FORSAV
09500 AOJA TAC4,BUBL21
09600 HRRZ BWREG,0(REPLCE)
09700 JRST TWOEYE
09800 ;**********
09900 ; ADJUST SOME BITS IN THE LEFT HALF OF THE AVAILABLE MOVE LIST (IE.,
10000 ;AFFECT SCORING AND MOVE PRUNING) IF CERTAIN SPECIAL SORTS OF PROPERTIES
10100 ;ARE DETECTED FOR A MOVE.
10200 ;**********
10300 BUBLPX: MOVEI TAC2,AFFMOV
10400 SKIPN TAC4,0(TAC2)
10500 JRST BUBLX1
10600 MOVE TAC3,AUXBTS-AFFMOV(TAC2)
10700 TRNE TAC3,SDBLAT+SATTWO
10800 TLZ TAC4,WKNTGT ;HAVING LIBS IS BETTER THAN HAVING WKNTGT
10900 TRNN TAC3,SDBLAT
11000 JRST .+4
11100 SKIPE FORSAV
11200 TLOA TAC4,CAPENM ;SAVER CAPTURES SOMETHING
11300 TLO TAC4,CAPFRD ;FORCER PREVENTS SAVER CAPTURE
11400 TRNN TAC3,FDBLAT
11500 JRST .+4
11600 SKIPN FORSAV
11700 TLOA TAC4,CAPENM ;FORCER CAPTURES SOMETHING
11800 TLO TAC4,CAPFRD ;SAVER PREVENTS FORCER CAPTURE
11900 ;*****DEMOTE BAD NXTTGT MOVES BY MAKING THEM CONTGT INSTEAD
12000 TRNN TAC3,SEMPT
12100 JRST BUBLX5
12200 SKIPE FORSAV
12300 JRST .+3
12400 TLNE TAC4,THRTGS
12500 JRST BUBLX5 ;FORCER IS CLOSING IN ON TARGET
12600 TLZE TAC4,NXTTGT
12700 TLO TAC4,CONTGT
12800 ;*****SEE IF MOVE HELPS FORCER PLAY ON FORCER SELF-ATARI POINT
12900 BUBLX5: TRNN TAC3,HLPSTR
13000 JRST BUBLX2
13100 HRRZ TAC1,LBSSTR-AFFMOV(TAC2)
13200 CAIG TAC1,2
13300 JRST BUBLX2
13400 TLO TAC4,CONTGT
13500 TLNN TAC4,NWLIB2+NEWLIB
13600 TLO TAC4,NEWLIB
13700 ;*****MAKE SURE SPECIAL SAVER MOVES AND THREATS ARE NOTICED
13800 BUBLX2: TLNE TAC4,NWLIB2+NEWLIB+EYMAKE
13900 JRST BUBLX6 ;MOVE ALREADY WELL DONE
14000 TRNE TAC3,SATTWO+SDBLAT+SREVIV
14100 JRST BBLX20
14200 TRNE TAC3,LADBRK
14300 JRST BUBLX6-1 ;LADDER-BREAKING PLAY
14400 JRST BUBLX6
14500 BBLX20: TRNE TAC3,NSTHRT
14600 JRST BUBLX6
14700 HLRZ TAC1,LBSSTR-AFFMOV(TAC2) ;SAVER LIBS
14800 SOJLE TAC1,BUBLX6
14900 TRNE TAC3,SDBLAT
15000 AOJA TAC1,BBLX21 ;USE ALL LIBS IN DOUBLE ATARI CASE
15100 TRNE TAC3,NLADDR
15200 JRST BUBLX6-1 ;LADDER DOESNT WORK
15300 BBLX21: TRNE TAC3,STHRET
15400 CAIG TAC1,3
15500 JRST BBLX22
15600 TLO TAC4,EYMAKE ;>3 LIBS "AS GOOD AS" EYE
15700 SUBI TAC1,3
15800 CAILE TAC1,3
15900 MOVEI TAC1,3
16000 BBLX22: TRNE TAC1,2
16100 TLO TAC4,NWLIB2
16200 TRNE TAC1,1
16300 TLO TAC4,NEWLIB
16400 ;*****SEE IF FORCER CAN PREVENT SAVER ATARI
16500 BUBLX6: TLNN TAC3,FORHLP
16600 JRST BUBLX4+1
16700 SETZ TAC,
16800 BUBLX3: HRRZ TAC1,AFFMOV(TAC)
16900 JUMPE TAC1,BUBLX4+1
17000 SUBI TAC1,0(TAC4)
17100 MOVM TAC1,TAC1
17200 CAIE TAC1,BRDWTH
17300 SOJN TAC1,BUBLX4
17400 HRRZ TAC1,LBSSTR(TAC)
17500 CAIG TAC1,1
17600 JRST BUBLX4
17700 HRLZI TAC1,TWOATE ;THIS MOVE PREVENTS A SAVER ATARI
17800 ORM TAC1,AFFMOV(TAC)
17900 BUBLX4: AOJA TAC,BUBLX3
18000 MOVEM TAC4,0(TAC2)
18100 AOJA TAC2,BUBLPX+1
18200 ;*****A PITCH (SACRIFICE) IS PROPOSED AS A GOOD MOVE TO TRY IF THERE
18300 ;*****IS NO WAY ACCEPTING THE SACRIFICE CAN BE GOOD FOR THE SAVING SIDE.
18400 ;*****NOTE A PITCH SPOT MAY BE A GOOD PLACE FOR THE SAVER TO PLAY ALSO.
18500 BUBLX1: MOVEI TAC2,AFFMOV
18600 PITCH2: SKIPN TAC1,0(TAC2)
18700 JRST PITCH1+1
18800 JUMPL TAC1,.+2
18900 TLNN TAC1,NWLIB2+NEWLIB
19000 AOJA TAC2,PITCH2
19100 MOVE TAC3,AUXBTS-AFFMOV(TAC2)
19200 TLNE TAC3,FSATE
19300 TRNE TAC3,NEWSTG
19400 AOJA TAC2,PITCH2
19500 MOVEI TAC4,1 ;SEE IF CAPTURE HELPS SAVER TARGET
19600 PITCH3: HRRZ TAC5,AFFMOV-1(TAC4)
19700 JUMPE TAC5,PITCH1 ;MOVE LIST EXHAUSTED
19800 SUBI TAC5,0(TAC1)
19900 MOVM TAC5,TAC5
20000 CAIN TAC5,BRDWTH
20100 JRST .+3
20200 CAIE TAC5,1
20300 AOJA TAC4,PITCH3
20400 MOVE TAC5,AFFMOV-1(TAC4)
20500 TLNE TAC5,NXTTGT+CONTGT
20600 TLNE TAC5,EYMAKE+NWLIB2+NEWLIB
20700 JRST PITCH1 ;CAPTURE DOES HELP SAVER
20800 SKIPN FORSAV
20900 JRST .+3
21000 TLNE TAC5,NREDUC ;SAVER MOVING AND
21100 JRST PITCH1 ;CAPTURE DOESNT HURT SAVER
21200 TLNN TAC1,WKNTGT
21300 JRST PITCH1-2
21400 SKIPE FORSAV
21500 JRST PITCH4
21600 TLNE TAC5,SAVTGS
21700 JRST PITCH1 ;CAPS >1 AND THREATENS, TOO
21800 JRST PITCH1-2
21900 PITCH4: TLNE TAC5,THRTGS
22000 JRST PITCH1 ;CAPS >1 AND THREATENS, TOO
22100 TLO TAC1,NREDUC+NATARI+NEWLIB+NWLIB2
22200 MOVEM TAC1,0(TAC2) ;PITCH IS NOW A GOOD MOVE
22300 PITCH1: AOJA TAC2,PITCH2
22400 SETZM BKFLAG ;*****USED TO DENOTE EXCEPTIONAL CONDITION
22500 SKIPN FORSAV
22600 JRST FORCUT
22700 ;**********
22800 ; THIS PRUNING LOOP GETS RID OF ALL OBVIOUSLY BAD SAVING MOVES.
22900 ;THE ONLY CLEAR-CUT CASE IS WHEN SAVER IS THREATENED.
23000 ;**********
23100 SVMODE: MOVEI TAC2,AFFMOV ;GET RID OF USELESS SAVER MOVES
23200 HRLZI TAC3,777777-(NREDUC+NATARI+NON1ST+NON2ND+WKSIDE)
23300 SKIPN TAC4,MSTSAV
23400 JRST SAVCLP
23500 MOVEI TAC4,SDBLAT+SATTWO
23600 SKIPG MSTSAV
23700 TLZA TAC3,777777-(NXTTGT+CONTGT) ;LADDER AGAINST TARGET
23800 TLZA TAC3,777777-CAPFRD ;SNAPBACK AGAINST TARGET
23900 TRO TAC4,LADBRK
24000 SAVCLP: SKIPN TAC5,0(TAC2)
24100 JRST BUBLOP-2
24200 JUMPL TAC5,.+3
24300 TDNN TAC5,TAC3
24400 TDNE TAC4,AUXBTS-AFFMOV(TAC2)
24500 AOJA TAC2,SAVCLP
24600 TLO TAC5,400000
24700 MOVEM TAC5,0(TAC2) ;THIS IS A LEGAL BUT USELESS MOVE
24800 AOS BNDCNL
24900 AOJA TAC2,SAVCLP
25000
25100 ;**********
25200 ; THERE ARE SEVERAL CASES WHERE IS IT CLEAR WHAT THE FORCING SIDE
25300 ;MUST DO IN ORDER TO PROCEDE. THESE CONDITIONS LEAD TO THE PRUNING
25400 ;SEEN BELOW.
25500 ;**********
25600 FORCUT: SETZ TAC3, ;IF SAVER WINNER, THEN CUT OUT IRRELEVANT MOVES
25700 SETZ TAC4,
25800 SKIPN MSTSAV
25900 SKIPE MUSTSV
26000 JRST FORCU1 ;MUST SAVE FRIENDLY STONES
26100 SKIPN SAVWIN
26200 JRST FORCLP-2 ;ONLY CUT OUT TRIVIAL MOVES FOR FORCER
26300 SKIPL CONFLG
26400 TLOA TAC3,NXTTGT+CONTGT ;SAVER WINS BY CONTGT EXTENSION
26500 TLO TAC3,NXTTGT ;SAVER WINS BY NXTTGT EXTENSION
26600 JRST FORCLP-1
26700 FORCU1: TLO TAC3,CAPFRD ;SAVER WINS BY CAPTURE
26800 TLOA TAC4,NEWLIB+NWLIB2+CONTGT+NREDUC
26900 ;THE REASON THESE BITS ARE IGNORED IS
27000 ;THAT THE PROGRAM ALWAYS CALCULATES IN
27100 ;TERMS OF ADDED SAVER LIBS, AND THIS IS
27200 ;IRRELEVANT WHEN FORCER IS SAVING HIMSELF
27300 HRLZI TAC3,777777-(NREDUC+NATARI+NON1ST+NON2ND+WKSIDE)
27400 MOVEI TAC2,AFFMOV
27500 FORCLP: SKIPN TAC5,0(TAC2)
27600 JRST FORCL1+2
27700 JUMPL TAC5,FORCL1+1
27800 TDZ TAC5,TAC4 ;IRRELEVANT BITS
27900 TDNE TAC5,TAC3
28000 JRST FORCL1
28100 TLO TAC5,400000
28200 AOS BNDCNL ;THIS MOVE IS IRRELEVANT
28300 FORCL1: MOVEM TAC5,0(TAC2)
28400 AOJA TAC2,FORCLP
28500 MOVE TAC4,BNDCNL
28600 CAIGE TAC4,MXMVES
28700 JRST BUBLOP-2
28800 ;*****NO ACCEPTABLE MOVES LEFT, SO RE-TRY THE NOT-TOO-BAD ONES
28900 MOVEI TAC2,AFFMOV
29000 NOCTF1: SKIPN TAC1,0(TAC2)
29100 JRST BUBLOP-2
29200 JUMPL TAC1,.+2
29300 SAILERR <7> ;******** ERROR MESSAGE 7 ********
29400 TLNN TAC1,377777-(NXTTGT+CONTGT+WKNTGT)
29500 AOJA TAC2,NOCTF1 ;THIS MOVE IS HOPELESS
29600 TLZ TAC1,400000
29700 MOVEM TAC1,0(TAC2) ;THIS MOVE MIGHT BE OK
29800 SOS BNDCNL
29900 AOJA TAC2,NOCTF1
30000
30100 ;**********
30200 ; BUBBLE SORT THE REMAINING LEGAL MOVE CANDIDATES TO DETERMINE
30300 ;HEURISTIC ORDER FOR THE LOOKAHEAD.
30400 ;**********
30500 MOVEI TAC1,AFFMOV
30600 SETZ TAC4,
30700 BUBLOP: CAIGE TAC2,2(TAC1)
30800 JRST BUBLP1
30900 MOVE TAC3,0(TAC1)
31000 CAML TAC3,1(TAC1)
31100 AOJA TAC1,BUBLOP
31200 EXCH TAC3,1(TAC1)
31300 MOVEM TAC3,0(TAC1)
31400 SETO TAC4,
31500 AOJA TAC1,BUBLOP
31600 BUBLP1: SKIPE TAC4
31700 SOJA TAC2,BUBLOP-2
31800 ;*****IF LEFTPARTS ARE EQUAL, PREFER THE ONE CLOSER TO THE CENTER
31900 MOVEI TAC2,AFFMOV
32000 CENLOP: SKIPG 1(TAC2)
32100 JRST CENLP1
32200 HLRZ TAC,0(TAC2)
32300 HLRZ TAC1,1(TAC2)
32400 CAME TAC,TAC1
32500 AOJA TAC2,CENLOP
32600 HRRZ TAC,0(TAC2)
32700 IDIVI TAC,BRDWTH
32800 SUBI TAC,BRDWTH/2
32900 MOVM TAC,TAC
33000 SUBI TAC1,BRDWTH/2
33100 MOVM TAC1,TAC1
33200 ADD TAC,TAC1 ;CENTER SCORE #1
33300 HRRZ TAC3,1(TAC2)
33400 IDIVI TAC3,BRDWTH
33500 SUBI TAC3,BRDWTH/2
33600 MOVM TAC3,TAC3
33700 SUBI TAC4,BRDWTH/2
33800 MOVM TAC4,TAC4
33900 ADD TAC3,TAC4 ;CENTER SCORE #2
34000 CAMG TAC,TAC3
34100 AOJA TAC2,CENLOP
34200 MOVE TAC3,0(TAC2)
34300 EXCH TAC3,1(TAC2)
34400 MOVEM TAC3,0(TAC2)
34500 AOJA TAC2,CENLOP
34600 CENLP1: SKIPLE AFFMOV
34700 JRST .+5 ;THERE IS A LEAST ONE OK MOVE
34800 MOVEI TAC5,=11
34900 SKIPN FORSAV
35000 MOVN TAC5,TAC5
35100 JRST SEXCSS+1 ;THERE WERE NO LEGAL MOVES TO SORT
35200 ;*****FILL IFORCE VECTOR WITH MOVE SELECTIONS
35300 SETZM AFFMOV+4 ;MAKE SURE PHASE ONE CUTOFF OBEYED
35400 MOVE TAC1,NDXFOR
35500 CAIL TAC1,PH1CUT
35600 SETZM AFFMOV+2 ;MAKE SURE PHASE TWO CUTOFF OBEYED
35700 SETZ TAC1,
35800 SKIPG TAC2,AFFMOV(TAC1)
35900 JRST CENLP2
36000 HRRZM TAC2,IFORCE(TAC1) ;MOVE LOCATION
36100 HLRZM TAC2,HEURBT(TAC1) ;MOVE SCORE
36200 AOJA TAC1,.-4
36300 CENLP2: SKIPE FORSAV
36400 POPJ PDP,
36500 SKIPN SAVWIN
36600 SKIPE SAVWN1
36700 BUBLP3: SETZM BNDCNL ;MAKE SURE NO GETA IS TRIED
36800 POPJ PDP, ;IS OK TO TRY GETA
00100 BEGIN LIBERT
00200
00300 ;**********
00400 ; LIBEST IS AN ALMOST-ALGORITHMIC LIBERTY ESTIMATOR. EXCEPT
00500 ;FOR QUITE SPECIAL CASES, IT IS COMPLETELY ACCURATE. IN ALMOST EVERY
00600 ;CASE WHERE LIBEST IS WRONG, THE ERROR DOES NOT AFFECT WHAT THE PROGRAM
00700 ;DOES. THE ACTUAL NUMBER OF LIBERTIES IS CALCULATED FOR BOTH A FRIENDLY
00800 ;AND AN ENEMY MOVE AT THE PROPOSED MOVE POINT. KO IS DETECTED, AND ANY
00900 ;CAPTURED STRING IS FULLY INVESTIGATED TO FIND HOW MANY LIBERTIES IT ADDS.
01000 ;NOTE TAC (PROPOSED MOVE POINT) AND FRIEND (WHICH SIDE IS FRIENDLY) MUST
01100 ;BE SET BY THE CALLING ROUTINE. LIBEST CLOBBERS MANY REGISTERS.
01200 ;**********
01300 INTERN NGHSTR,LIBVEC,LIBEST
01400 ↑↑LIBVEC: ;HEADER NAME FOR INFO VECTOR RETURNED BY LIBEST
01500 ;***LHS OF ACTLB. CONTAINS TOTAL OF ALL LIBS ADDED BY CAPTURES
01600 ACTLBF: 0 ;RHS HAS ACTUAL NUMBER OF FRIENDLY LIBERTIES
01700 ACTLBE: 0 ;RHS HAS ACTUAL NUMBER OF ENEMY LIBERTIES
01800 FRDSTR: 0 ;LIBERTIES ADDED TO FRIENDLY BY NEIGHBORS
01900 ENMSTR: 0 ;LIBERTIES ADDED TO ENEMY BY NEIGHBORS
02000 NUMCAE: 0 ;NUMBER OF CAPTURED ENEMY STONES (BY FRIENDLY)
02100 NUMCAF: 0 ;NUMBER OF CAPTURED FRIENDLY STONES (BY ENEMY)
02200 FRDDUP: 0 ;NUMBER OF DUPLICATED FRIENDLY LIBERTIES
02300 ENMDUP: 0 ;NUMBER OF DUPLICATED ENEMY LIBERTIES
02400 ;***NOTE TO HERE THAT LIBVEC HAS FRIENDLY QUANTITIES PRECEEDING ENEMY
02500 ;***QUANTITIES IN THE VECTOR.
02600 BLANKS: 0 ;NUMBER OF ADJACENT BLANKS
02700 KOTEST: 0 ;KO MASK AS REQUIRED BY AUXBTS IN GOLOOK
02800 ↑↑NGHSTR:BLOCK 12 ;NEIGHBORS, CAPTURED NEIGHBORS
02900 ↑↑LIBEST:MOVEI TAC1,7
03000 SETZM LIBVEC+2(TAC1)
03100 SOJGE TAC1,.-1
03200 MOVEI TAC1,3
03300 SETZM NGHSTR ;HOLDS USED STRING #'S
03400 SETZM NGHSTR+5 ;HOLDS CAPTURED STRING #'S
03500 SETZ TAC2, ;KO CALCULATION BOOKKEEPER
03600 LIBES2: LDB SEARCH,[POINT 7,@GB1TST(TAC1),35] ;STRING #
03700 JUMPN SEARCH,LIBES3
03800 TLO TAC2,KOTAKS+KOTAKF ;THIS MOVE CANT EVER BE KO
03900 AOS BLANKS ;COUNT THIS BLANK
04000 MOVE TAC5,@GB1TST+1(TAC1)
04100 AND TAC5,@G1DIAG+1(TAC1)
04200 ANDI TAC5,BLKOCC+WHTOCC
04300 JUMPE TAC5,LIBES1
04400 JRST LIBES8
04500 LIBES3: CAIN SEARCH,177
04600 JRST LIBES1 ;POINT IS OFF EDGE
04700 MOVEI TAC3,NGHSTR ;OLD USED STRING #'S
04800 SKIPN TAC4,0(TAC3)
04900 JRST .+4
05000 CAME SEARCH,TAC4
05100 AOJA TAC3,.-3
05200 JRST LIBES7 ;HAVE SEEN THIS STRING ALREADY
05300 MOVEM SEARCH,0(TAC3) ;SAVE NEW STRING NAME
05400 SETZM 1(TAC3)
05500 LDB TAC3,[POINT 9,STRPTR(SEARCH),35] ;# LIBS
05600 TDNN FRIEND,@GB1TST(TAC1)
05700 JRST LIBES5
05800 TLO TAC2,KOTAKS ;CANT BE KO FOR SAVER
05900 SOJN TAC3,LIBES4
06000 ;*****ONE-LIB TARGET-SIDE STRING
06100 LDB TAC4,[POINT 9,STRPTR(SEARCH),26]
06200 ADDM TAC4,NUMCAF ;# FRIENDLY-SIDE PRISONERS
06300 JRST LIBES6
06400 LIBES4: ADDM TAC3,FRDSTR ;SAVER LIBS ADD
06500 JRST LIBES7
06600 LIBES5: TLO TAC2,KOTAKF ;CANT BE KO FOR FORCER
06700 SOJN TAC3,LIBES7-1
06800 ;*****ONE-LIB ENEMY-SIDE STRING
06900 LDB TAC4,[POINT 9,STRPTR(SEARCH),26]
07000 ADDM TAC4,NUMCAE ;# ENEMY-SIDE PRISONERS
07100 LIBES6: MOVEI TAC5,NGHSTR+5
07200 SKIPE 0(TAC5)
07300 AOJA TAC5,.-1
07400 MOVEM SEARCH,0(TAC5) ;SAVE CAPTURED STRING NAME
07500 SETZM 1(TAC5) ;RESTORE END MARKER
07600 JRST LIBES7
07700 ADDM TAC3,ENMSTR ;FORCER LIBS ADD
07800 ;*****CHECK FOR THE SIMPLEST SORTS OF DUPLICATIONS
07900 LIBES7: MOVE TAC5,@GB1TST(TAC1)
08000 AND TAC5,@GB1TST+1(TAC1)
08100 ANDI TAC5,BLKOCC+WHTOCC
08200 JUMPE TAC5,.+3
08300 MOVE TAC4,@G1DIAG+1(TAC1)
08400 JRST LIBES8-2
08500 MOVE TAC5,@GB1TST(TAC1)
08600 AND TAC5,@G1DIAG+1(TAC1)
08700 ANDI TAC5,BLKOCC+WHTOCC
08800 JUMPE TAC5,LIBES1
08900 MOVE TAC4,@GB1TST+1(TAC1)
09000 TRNN TAC4,BNKOCC
09100 JRST LIBES1
09200 LIBES8: TDNN TAC5,FRIEND
09300 AOSA ENMDUP ;DUPLICATE ENEMY-SIDE LIB
09400 AOS FRDDUP ;DUPLICATE FRIENDLY-SIDE LIB
09500 LIBES1: SOJGE TAC1,LIBES2
09600 ;*****THE KOTAK BITS ARE LEFT ON IF THIS POINT IS A KO CAPTURE
09700 TLCE TAC2,KOTAKS
09800 JRST .+4 ;CANT BE KO FOR SAVER
09900 MOVE TAC1,NUMCAE
10000 CAIE TAC1,1
10100 TLZ TAC2,KOTAKS ;CANT BE KO FOR SAVER
10200 TLCE TAC2,KOTAKF
10300 JRST .+4 ;CANT BE KO FOR FORCER
10400 MOVE TAC1,NUMCAF
10500 CAIE TAC1,1
10600 TLZ TAC2,KOTAKF ;CANT BE KO FOR FORCER
10700 MOVEM TAC2,KOTEST
10800 MOVE TAC1,BLANKS
10900 ADD TAC1,FRDSTR
11000 SUB TAC1,FRDDUP
11100 MOVEM TAC1,ACTLBF ;ACTUAL NUMBER OF FRIENDLY LIBS
11200 MOVE TAC1,BLANKS
11300 ADD TAC1,ENMSTR
11400 SUB TAC1,ENMDUP
11500 MOVEM TAC1,ACTLBE ;ACTUAL NUMBER OF ENEMY LIBS
11600 ;*****SEE IF CAPTURED STRINGS MODIFY LIBERTY ESTIMATE
11700 MOVEI TAC5,NGHSTR+5
11800 LIBES9: SKIPN SEARCH,0(TAC5)
11900 POPJ PDP,
12000 HRLM TAC,0(PDP) ;DONT DESTROY CURRENT POINT POINTER
12100 PUSHJ PDP,CAPLBS
12200 HLRZ TAC,0(PDP)
12300 MOVE TAC1,TACSAV
12400 HRL TAC4,TAC4 ;PUT # LIBS ADDED IN LHS ALSO
12500 TDNN FRIEND,GB1(TAC1)
12600 JRST .+3
12700 ADDM TAC4,ACTLBE ;LIBS FROM CAPTURED FRIENDLY STRING
12800 AOJA TAC5,LIBES9
12900 ADDM TAC4,ACTLBF ;LIBS FROM CAPTURED ENEMY STRING
13000 AOJA TAC5,LIBES9
13100
13200 ;**********
13300 ; WE NEED A RECURSIVE SEARCH ALONG ANY CAPTURED STRING TO DETERMINE
13400 ;HOW MANY LIBERTIES THE CAPTURING MOVE "REALLY" GAINS FROM THE CAPTURE.
13500 ;NOTE THIS PROCEDURE WILL WORK WHENEVER NGHSTR IS PROPERLY SET UP.
13600 ;**********
13700 CAPLBS: PUSHJ PDP,STRSET+1
13800 MOVE TAC1,[PUSHJ PDP,CAPLB1]
13900 MOVEM TAC1,DRIVR1-3
14000 SETZ TAC4, ;HOLDS # LIBS GAINED
14100 CAPLB1: MOVEI TAC1,3
14200 LDB TAC2,[POINT 7,@GB1TST(TAC1),35]
14300 JUMPE TAC2,CAPLB4
14400 CAME TAC2,SEARCH
14500 CAMN TAC2,REPLCE
14600 JRST CAPLB2 ;POINT IN CAPTURED STRING
14700 MOVEI TAC3,NGHSTR
14800 CAPLB3: SKIPN 0(TAC3)
14900 JRST CAPLB2 ;NO MORE POSSIBLE STRINGS
15000 CAMN TAC2,0(TAC3)
15100 CAPLB4: AOJA TAC4,ADLEND+1 ;FOUND AN ADDED LIBERTY
15200 AOJA TAC3,CAPLB3
15300 CAPLB2: SOJGE TAC1,CAPLB1+1
15400 JRST ADLEND+1
15500
15600 BEND
15700
15800 END